home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / xlib / yicons24 / source / draw.yar < prev    next >
Text File  |  1993-03-05  |  100KB  |  3,244 lines

  1. nstrate the GetImage and PutImage commands }
  2.  
  3. const
  4.   r  = 20;
  5.   StartX = 100;
  6.   StartY = 50;
  7.  
  8. var
  9.   CurPort : ViewPortType;
  10.  
  11. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  12. var
  13.   Step : integer;
  14. begin
  15.   Step := Random(2*r);
  16.   if Odd(Step) then
  17.     Step := -Step;
  18.   X := X + Step;
  19.   Step := Random(r);
  20.   if Odd(Step) then
  21.     Step := -Step;
  22.   Y := Y + Step;
  23.  
  24.   { Make saucer bounce off viewport walls }
  25.   with CurPort do
  26.   begin
  27.     if (x1 + X + Width - 1 > x2) then
  28.       X := x2-x1 - Width + 1
  29.     else
  30.       if (X < 0) then
  31.         X := 0;
  32.     if (y1 + Y + Height - 1 > y2) then
  33.       Y := y2-y1 - Height + 1
  34.     else
  35.       if (Y < 0) then
  36.         Y := 0;
  37.   end;
  38. end; { MoveSaucer }
  39.  
  40. var
  41.   Pausetime : word;
  42.   Saucer    : pointer;
  43.   X, Y      : integer;
  44.   ulx, uly  : word;
  45.   lrx, lry  : word;
  46.   Size      : word;
  47.   I         : word;
  48. begin
  49.   ClearDevice;
  50.   FullPort;
  51.  
  52.   { PaintScreen }
  53.   ClearDevice;
  54.   MainWindow('GetImage / PutImage Demonstration');
  55.   StatusLine('Esc aborts or press a key...');
  56.   GetViewSettings(CurPort);
  57.  
  58.   { DrawSaucer }
  59.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  60.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  61.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  62.   Circle(StartX+10, StartY-12, 2);
  63.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  64.   Circle(StartX-10, StartY-12, 2);
  65.   SetFillStyle(SolidFill, MaxColor);
  66.   FloodFill(StartX+1, StartY+4, GetColor);
  67.  
  68.   { ReadSaucerImage }
  69.   ulx := StartX-(r+1);
  70.   uly := StartY-14;
  71.   lrx := StartX+(r+1);
  72.   lry := StartY+(r div 3)+3;
  73.  
  74.   Size := ImageSize(ulx, uly, lrx, lry);
  75.   GetMem(Saucer, Size);
  76.   GetImage(ulx, uly, lrx, lry, Saucer^);
  77. {  PutImage(ulx, uly, Saucer^, XORput);               { erase image }
  78.  
  79.   { Plot some "stars" }
  80.   for I := 1 to 1000 do
  81.      PutPixel(Random(MaxX), Random(MaxY), RandColor);
  82.   X := MaxX div 2;
  83.   Y := MaxY div 2;
  84.   PauseTime := 70;
  85.  
  86.   { Move the saucer around }
  87.   repeat
  88. {     PutImage(X, Y, Saucer^, XORput);                 { draw image }
  89.      Delay(PauseTime);
  90. {     PutImage(X, Y, Saucer^, XORput);                 { erase image }
  91.      MoveSaucer(X, Y, lrx - ulx + 1, lry - uly + 1);  { width/height }
  92.   until KeyPressed;
  93.   FreeMem(Saucer, size);
  94.   WaitToGo;
  95. end; { PutImagePlay }
  96.  
  97. procedure PolyPlay;
  98. { Draw random polygons with random fill styles on the screen }
  99. const
  100.   MaxPts = 5;
  101. type
  102.   PolygonType = array[1..MaxPts] of PointType;
  103. var
  104.   Poly : PolygonType;
  105.   I, Color : word;
  106. begin
  107.   MainWindow('FillPoly demonstration');
  108.   StatusLine('Esc aborts or press a key...');
  109.   repeat
  110.     Color := RandColor;
  111.     SetFillStyle(Random(11)+1, Color);
  112.     SetColor(Color);
  113.     for I := 1 to MaxPts do
  114.       with Poly[I] do
  115.       begin
  116.         X := Random(MaxX);
  117.         Y := Random(MaxY);
  118.       end;
  119.     FillPoly(MaxPts, Poly);
  120.   until KeyPressed;
  121.   WaitToGo;
  122. end; { PolyPlay }
  123.  
  124. procedure FillStylePlay;
  125. { Display all of the predefined fill styles available }
  126. var
  127.   Style    : word;
  128.   Width    : word;
  129.   Height   : word;
  130.   X, Y     : word;
  131.   I, J     : word;
  132.   ViewInfo : ViewPortType;
  133.  
  134. procedure DrawBox(X, Y : word);
  135. begin
  136.   SetFillStyle(Style, MaxColor);
  137.   with ViewInfo do
  138.     Bar(X, Y, X+Width, Y+Height);
  139.   Rectangle(X, Y, X+Width, Y+Height);
  140.   OutTextXY(X+(Width div 2), Y+Height+4, Int2Str(Style));
  141.   Inc(Style);
  142. end; { DrawBox }
  143.  
  144. begin
  145.   MainWindow('Pre-defined fill styles');
  146.   GetViewSettings(ViewInfo);
  147.   with ViewInfo do
  148.   begin
  149.     Width := 2 * ((x2+1) div 13);
  150.     Height := 2 * ((y2-10) div 10);
  151.   end;
  152.   X := Width div 2;
  153.   Y := Height div 2;
  154.   Style := 0;
  155.   for J := 1 to 3 do
  156.   begin
  157.     for I := 1 to 4 do
  158.     begin
  159.       DrawBox(X, Y);
  160.       Inc(X, (Width div 2) * 3);
  161.     end;
  162.     X := Width div 2;
  163.     Inc(Y, (Height div 2) * 3);
  164.   end;
  165.   SetTextJustify(LeftText, TopText);
  166.   WaitToGo;
  167. end; { FillStylePlay }
  168.  
  169. procedure FillPatternPlay;
  170. { Display some user defined fill patterns }
  171. const
  172.   Patterns : array[0..11] of FillPatternType = (
  173.   ($AA, $55, $AA, $55, $AA, $55, $AA, $55 üÖü üÖü  !BBäx!!!BBäx!BBäx"""DDêp""DDêp>"""BBääêp""!"BDäêêp>IÉÆ|      ° @≥î>00>><Dêx  !BBäx""DDêp&<"DDêê&22TTêêê$> $< @äêp>          ⁿBBBB<  @@Ç****DDDDDDDU¬U¬U¬U¬U¬U¬U¬▌w▌w▌w▌w▌w▌w▌w°°°≥■°°≥≥■≥≥■■°°°    ≤  ≤  ≤≤         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       ;DDD;    $"Bdÿ>@@@>||>Ac]AAA1N"A""2,  `1NA"*III*<Bü üB<<BüüüB<A" \"QIE" < <BBBB  @@    ~ ?  @ÇB$$B ""A$$"AII6 üBr»$**IIII**ccregion.  The region is defined as any pixel of
  174.             OldColor which has a path of pixels of OldColor or NewColor
  175.             with sides touching back to the seed point, (XSeed, YSeed).
  176.             Therefore, only pixels of OldColor are modified and no other
  177.             information is changed.
  178.  
  179.             SEE ALSO
  180.  
  181.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  182.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  183.             SETVIEW
  184.  
  185.             EXAMPL(HNxHHO$B<BBBB<$<BBBB<<BBBB<$BBBBBF:0BBBBF:$BBBF:B<""AAA""AAAAA"<B@@B<" <2\A">>xDDxDNDD <` <>BB= > <BBBB< BBBBF:2L\bBBBB&AaQIECA8$>""">0@@A>@@@ b$(. b$(*
  186.     $    $    $DDDDDDD¬U¬U¬U¬U¬U¬U¬Uw▌w▌w▌w▌w▌w▌w▌°°°⌠ⁿ°°⌠⌠ⁿ⌠⌠ⁿⁿ°°°    ≈  ≈  ≈≈         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       7HH7"B\DBBRL~BB@@@@@@?R~!!~?DDDD8BBBB|@@Ç>P>III>"AA""AAA"Uw<DDDD86II6"EIQ"\ @@ "AAAAA> >     hH02L2L$$<H(,$<>>>>>>>         VMODE=VIDEOMODEGET
  187.             IF WHICHVGA = 0 THEN STOP
  188.             DUMMY=RES640
  189.             SETVIEW 100, 100, 539, 379
  190.             FILLVIEW 10
  191.             WHILE INKEY$ = ""
  192.             WEND
  193.             VIDEOMODESET VMODE
  194.             END
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.                                                                          63
  212.  
  213.  
  214.  
  215.  
  216.  
  217.           FONTGETINFO
  218.  
  219.             PROTOTYPE
  220.  
  221.             SUB FONTGETINFO (Width%, Height%)
  222.  
  223.             INPUT
  224.  
  225.             no input parameters
  226.     WEND
  227.             MOUSEEXIT
  228.             VIDEOMODESET VMODE
  229.             END
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.                                                                          86
  271.  
  272.  
  273.  
  274.  
  275.  
  276.           MOUSECURSORDEFAULT
  277.  
  278.             PROTOTYPE
  279.  
  280.             SUB MOUSECURSORDEFAULT ()
  281.  
  282.             INPUT
  283.  
  284.             no input parameters
  285.  
  286.             OUTPUT
  287.  
  288.             no value returned
  289.  
  290.             USAGE
  291.  
  292.             MOUSECURSORDEFAULT defines the mouse cursor to be a small
  293.        ,K$╖┼╘╤░XQ)σ┤ö≡÷┴─┤àñT┘,╘¬àñX9╘⌠àñ\9╘UÜ╢≤`9╘4a╘d9╘UTa╘h9╘ta╘l9╘Uöa╘p9╘┤a╘t┘PT±x┴îÇ╖0▓ïα│ÅαU┤ôα╡ùα╢¢α╖úΓ╘pǺΓ╕¡αë ╚┴πì°sKÉφb<$⌡▌ë     φë φë I1φë  Eφë $YφÆë (mφë ,üφë 0$òφë á⌐φë ñ╜φë I¿╤φë ¼σφë ░∙φÆë 4²ë ┤!²ë ╕$5²ë ╝I²ë └]²ë ⌐8q²ë <àⁿΦiǬ∙PÖÇ ¥Ç
  294. ⁿ░╨â@%8@ΓΦá╝╤░≡cÑÅ*$░╕≡ż≡τ╥m¿⌡ε    ╨@#µ≈$âh$âαra╨à`¥è∩Ç%Ç +─▀ TîcOî∩â°1<@  [$¿Ç¼ MMl·0ƒ Y¼─!%6a▐è ¥ì ßá+?±  P<îaTTV ╪iÇ¡≥░ `_ñ»%Çá᪠P█º»ε`éa∙É%H«┴íA%Gár∙É
  295. iw∙Éiφ`╧≥≡╤Çmⁿ▒
  296. ]ÆAáσw7░⌡∩    $·╟Ç√É&^`  ┐ $ⁿ  $■ $╒ nk$J-ÉQ1£PéBù »0αQ/Ñ4╜£░ºP≈Ñ4Ç⌡$(ª▀$@C]Æé≈└╕_SÇçÑ4=iÉ⌠ä╣<_np@Ñ45ò▒Y3ü¼Qí░.i>╠@5+┴╙É╛╙$@ #┴@«╦
  297. $╤
  298. #@Ñú4,p&e÷ü¼_ÇQºÑ4òQ  ü@;¡_áQ@e╠≥@mp!┤a╘O░√`Pñź ÇT°8ÿ!¼Åñ$½╙"q¿ PñCÇ¿α√└╥░eT"ß<p°%Pæ(╧%pδ¥/OêW0Ǽbφ φ B@[â¼8â≥µ≤(    ¿⌡%(Ç∩áTÿp+ óÜ▓0!Σ±(1±░┤ÖÇD└D0Å╡`   $ «îO@╧1
  299. a╝╤j-0ñ│`@╖bΦaT1═⌠╝╤Σ²¼±,1öíî9lÿ28ÇÅ`Γî¿P²$,N0┴O0a╫δ≤0σú`°î╖#0δ≡└X▄1»Σî(▒¥Ç█Ñ"qá√1CÇú╟╨º Å
  300. FT Θ²î└1ÇY0    w ²à░$@AÅ`╦Φ¼╘`▄1A  }┐Ç*5 ΩSδδî`¼îaδæ¼î5 1¿⌡Ω╜⌠ ¼¥╬ü└Qî1S╛≤î9╨iÇ,∙PU(}Ç$üÇ àÇ`σìÇ`QαÜBO$%ÿÇ╧"$Ç«Ç]É.┬\`%WÉ$  W0 ÄâO0]αG┬ur╩░£▒Q¢ú╔Ç≡°s?`X0╘`@ µWâ@╣aá εdq`¥9?Ç&+o0µyÄΣAÅuV(7P╬±@IdQ╕@Å┤@;Ç▓?Çò│CÇ┤╟╨╡KÇÄ30ⁿφ° ó╬ì+]Ä╦≡     Mö╝σ ²y5<!└▀óâ╝É3~mp    $<╛≤9Æ-2ⁿ≡@T,╞Σa,)Pæ└¥#¼╪Q┤S(¼@Aîa≡╤@Ö²±⌠KëD─┴▒▀0╨Ñ$╩-0 ╨ê*╙▓edm`î=3Kß-10è=≥≤²└£mîjy ÿe²ⁿ╨i╕e▓ΣmαÖ╢C%Ç*ê*0 EátQZ`mÄLP%    °üⁿªüNQ∙  T¿<qtWΩc z░ÅÇñΩçǪçÇ«;└<┐á¼¥. á?<Σscî)áí := 0;
  301.       end;
  302.     end;
  303.   end;
  304.   WaitToGo;
  305. end; { UserLineStylePlay }
  306.  
  307.  
  308. procedure SayGoodbye;
  309. { Say goodbye and then exit the program }
  310. var
  311.   ViewInfo : ViewPortType;
  312. begin
  313.   MainWindow('');
  314.   GetViewSettings(ViewInfo);
  315.   SetTextStyle(TriplexFont, HorizDir, 4);
  316.   SetTextJustify(CenterText, CenterText);
  317.   with ViewInfo do
  318.     OutTextXY((x2-x1) div 2, (y2-y1) div 2, 'That''s all folks!');
  319.   StatusLine('Press any key to quit...');
  320.   repeat until KeyPressed;
  321. end; { SayGoodbye }
  322.  
  323.  
  324. PROCEDURE SelectMode;
  325. VAR
  326.     choice1,choice2     : CHAR;
  327.    xsize,ysize            : WORD;
  328. BEGIN
  329.     (* Let's select a mode *)
  330.     ClrScr;
  331.     WriteLn('VESADEMO:');
  332.     WriteLn('1. 256 colors');
  333.     WriteLn('2. 32768 colors');
  334.     WriteLn('3. 65536 colors');
  335.     WriteLn('4. 16777216 colors');
  336.     WriteLn('Q uit');
  337.     WriteLn;
  338.     Write('Your choice: ');
  339.     REPEAT
  340.         ReadLn(choice1);
  341.       IF choice1 <> '1' THEN BEGIN
  342.           WriteLn('Sorry !');
  343.          WriteLn('This demo wasn''t written for more as 256 colors !');
  344.          WriteLn('You would only get a limited impression of the Hi-& TrueColor modes...');
  345.          WriteLn('Switching to 256 colors.');
  346.          choice1 := '1';
  347.       END;
  348.     UNTIL choice1 IN ['1'..'4','q'];
  349.     IF choice1 = 'q' THEN Halt;
  350.  
  351.     WriteLn;
  352.     WriteLn;
  353.     WriteLn('a. 320x200');
  354.     WriteLn('b. 640x480');
  355.     WriteLn('c. 800x600');
  356.     WriteLn('d. 1024x768');
  357.     WriteLn('e. 1280x1024');
  358.     WriteLn('Q uit');
  359.     WriteLn;
  360.     Write('Your choice: ');
  361.     REPEAT
  362.         ReadLn(choice2);
  363.     UNTIL choice2 IN ['a'..'e','q'];
  364.     IF choice2 = 'q' THEN Halt;
  365.  
  366.     CASE choice2 OF
  367.         'a' : BEGIN
  368.             xsize := 320;
  369.             ysize := 200;
  370.         END;
  371.         'b' : BEGIN
  372.             xsize := 640;
  373.             ysize := 480;
  374.         END;
  375.         'c' : BEGIN
  376.             xsize := 800;
  377.             ysize := 600;
  378.         END;
  379.         'd' : BEGIN
  380.             xsize := 1024;
  381.             ysize := 768;
  382.         END;
  383.         'e' : BEGIN
  384.             xsize := 1280;
  385.             ysize := 1024;
  386.         END;
  387.     END;
  388.     CASE choice1 OF
  389.         '1' : mode := FindVesaMode(xsize,ysize,8);
  390.         '2' : mode := FindVesaMode(xsize,ysize,15);
  391.         '3' : mode := FindVesaMode(xsize,ysize,16);
  392.         '4' : mode := FindVesaMode(xsize,ysize,24);
  393.     END;
  394.     IF mode = 0 THEN BEGIN
  395.         WriteLn('No such mode could be found !');
  396.         WriteLn('Switching to to 320x200.');
  397.         ReadKey;
  398.         mode := V320x200x256;
  399.     END;
  400. END;
  401.  
  402. begin { program body }
  403.   SelectMode;
  404.   Initialize;
  405.   ReportStatus;
  406.  
  407. {  AspectRatioPlay; }
  408.   FillEllipsePlay;
  409.   SectorPlay;
  410.   WriteModePlay;
  411.  
  412.   ColorPlay;
  413.   { PalettePlay only intended to work on these drivers: }
  414.   if (GraphDriver = EGA) or
  415.       (GraphDriver = EGA64) or
  416.       (GraphDriver = VGA) then
  417.      PalettePlay;
  418.   PutPixelPlay;
  419. {  PutImagePlay; }
  420.   RandBarPlay;
  421.   BarPlay;
  422.   Bar3DPlay;
  423.   ArcPlay;
  424.   CirclePlay;
  425.   PiePlay;
  426.   LineToPlay;
  427.   LineRelPlay;
  428. {  LineStylePlay; }
  429. {  UserLineStylePlay; }
  430.   TextDump;
  431.   TextPlay;
  432.   CrtModePlay;
  433.   FillStylePlay;
  434.   FillPatternPlay;
  435.   PolyPlay;
  436.   SayGoodbye;
  437. {  CloseGraph; }
  438.   CloseVesa;
  439. end.
  440. ***************************************************
  441.     '* SHOW D2ROTATE (ABOUT THE ORIGIN)
  442.     '****************************************************************∞╥≤c≤*φè#^│v/╒:j═φ0t+l▓ô"¬"g└≡?%ªêΣ│H╫½╫╜├¿U'╒⌐⌡ ßV?╩¬ujOΦçEZ1∞▐! ▄B╛Σ8║æ]1GlNÜ┐q▌▓;ô$ΦzE<cª*bEô#ä╧ñÅ"∩─LrdaÖ ╠º╫a^¥£å╬1~)@ëÖMδ╫0═6DäFê¬Çv┼ß╨kæpτ╪É)}ª 1w3╤╧ü⌡¥╓h▓╣≈ïÅaÑ[TⁿHqªÉ╝DKÄ─Y-∞tT╤Θ╨º╟╪.*ÇI9lΦ≈{πτcσ$τπßoFr╪╨∩┼╞╟;O2■e²LÜ4^N|╪½ÅO?╔°FOz`╟╟╟'<>>π$πΘù6·Xgî╖│°oîδπGƒd╝▀░?■╪╔_9L ⌡ôⁿq'æO▀ƒn4╔▀╚▄┼3pτ.òO°·}÷╕ⁿ±'æO?ít│!√8ßÑ≤/┐╣p┼≥┘E╦Vox╕cΦé5╟╚º╙$?√$≥ΘZεsî≡åìΓpKù¢ïß X╥ 9╞≈\µk┤O¥_ 5Üö\≤éÄ┌╤A[╤ÿáï┼éNⁿÅu16    g,%hc╙╨cD╨Vï┘R¢öKñR;8εáΣ╢╪ós╤π╡á└èxgzPÄMú╫yαºÉ+σJ¢i+▓â3╥    ═Ñ╙î^ºG▓█πérφçs %#(╗⌠?┼%u8≡6+QÉ))ò)Afw≈╣╪)B&4░åLXV:δät@Å.;5Φf╢Ät┐ΣJ╫─U8úÇ╟éö£╕p╔┴⌠vg╨╬╥é÷╪╣┬ΓI.ç≡^v╤ZΦÇ& ╒┌6ñô6XßNè╡╬E₧Ñ
  443. kIº╠▄A+╣╥éb²tæ-Y¡½αÑa═uuîÇ╢αêvhuª╡SÅ┤vèùú¥F;p<d⌐/F─d█éT%▓KΦû=q■öI┐ ┐╠6S$▒÷╚ENΩ¥Fû9╔┌R'╝ ╧φ└?g┬j▓0═/b╖₧─mûé╢┌»ÿÄë/·<éò■░╤╟╢├Xσ:╥P3Θ"╬Læsφ░┌öSö!╗¿*mN£WΣÇ£┤~#╗ææ≥RΩóh:à▌.æ≈╕▌v£äàd▒à╒├=░╖π║$howeg*╬    6ù▄ƒô╕φ░Ö╢qΘD>(w@úKεHÆ╛öúΣU
  444. éÜR╔╤W▄èê 2M%ó.▓SNÖA1ùJE╢║l]▓¿>\%└Å4ßO▄£â⌐& ê/)8vSP▀▓ôⁿææ√ü√ÑÄa⌠â╚4S╓╟P- ?Σá╕▓Næ*q╡UΘ▓≈^ñ·I.rúR&$Y^╚%è≡B┌≈Ceat
  445.     Color := RandColor;
  446.     SetColor(Color);
  447.     SetFillStyle(Random(CloseDotFill)+1, Color);
  448.     Bar3D(Random(MaxWidth), Random(MaxHeight),
  449.           Random(MaxWidth), Random(MaxHeight), 0, TopOff);
  450.   until KeyPressed;
  451.   WaitToGo;
  452. end; { RandBarPlay }
  453.  
  454. procedure ArcPlay;
  455. { Draw random arcs on the screen }
  456. var
  457.   MaxRadius : word;
  458.   EndAngle : word;
  459.   ArcInfo : ArcCoordsType;
  460. begin
  461.   MainWindow('Arc / GetArcCoords demonstration');
  462.   StatusLine('Esc aborts or press a key');
  463.   MaxRadius := MaxY div 10;
  464.   repeat
  465.     SetColor(RandColor);
  466.     EndAngle := Random(360);
  467.     SetLineStyle(SolidLn, 0, NormWidth);
  468.     Arc(Random(MaxX), Random(MaxY), Random(EndAngle), EndAngle, Random(MaxRadius));
  469.     GetArcCoords(ArcInfo);
  470.     with ArcInfo do
  471.     begin
  472.       Line(X, Y, XStart, YStart);
  473.       Line(X, Y, Xend, Yend);
  474.     end;
  475.   until KeyPressed;
  476.   WaitToGo;
  477. end; { ArcPlay }
  478.  
  479. procedure PutPixelPlay;
  480. { Demonstrate the PutPixel and GetPixel commands }
  481. const
  482.   Seed   = 1962; { A seed for the random number generator }
  483.   NumPts = 2000; { The number of pixels plotted }
  484.   Esc    = #27;
  485. var
  486.   I : word;
  487.   X, Y, Color : word;
  488.   XMax, YMax  : integer;
  489.   ViewInfo    : ViewPortType;
  490. begin
  491.   MainWindow('PutPixel / GetPixel demonstration');
  492.   StatusLine('Esc aborts or press a key...');
  493.  
  494.   GetViewSettings(ViewInfo);
  495.   with ViewInfo do
  496.   begin
  497.     XMax := (x2-x1-1);
  498.     YMax := (y2-y1-1);
  499.   end;
  500.  
  501.   while not KeyPressed do
  502.   begin
  503.     { Plot random pixels }
  504.     RandSeed := Seed;
  505.     I := 0;
  506.     while (not KeyPressed) and (I < NumPts) do
  507.     begin
  508.       Inc(I);
  509.         PutPixel(Random(XMax)+1, Random(YMax)+1, RandColor);
  510.     end;
  511.  
  512.     { Erase pixels }
  513.     RandSeed := Seed;
  514.     I := 0;
  515.     while (not KeyPressed) and (I < NumPts) do
  516.     begin
  517.       Inc(I);
  518.       X := Random(XMax)+1;
  519.       Y := Random(YMax)+1;
  520.       Color := GetPixel(X, Y);
  521.         if Color = RandColor then
  522.           PutPixel(X, Y, 0);
  523.      end;
  524.   end;
  525.   WaitToGo;
  526. end; { PutPixelPlay }
  527.  
  528. procedure PutImagePlay;
  529. { Demonstrate the GetImage and PutImage commands }
  530.  
  531. const
  532.   r  = 20;
  533.   StartX = 100;
  534.   StartY = 50;
  535.  
  536. var
  537.   CurPort : ViewPortType;
  538.  
  539. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  540. var
  541.   Step : integer;
  542. begin
  543.   Step := Random(2*r);
  544.   if Odd(Step) then
  545.     Step := -Step;
  546.   X := X + Step;
  547.   Step := Random(r);
  548.   if Odd(Step) then
  549.     Step := -Step;
  550.   Y := Y + Step;
  551.  
  552.   { Make saucer bounce off viewport walls }
  553.   with CurPort do
  554.   begin
  555.     if (x1 + X + Width - 1 > x2) then
  556.       X := x2-x1 - Width + 1
  557.     else
  558.       if (X < 0) then
  559.         X := 0;
  560.     if (y1 + Y + Height - 1 > y2) then
  561.       Y := y2-y1 - Height + 1
  562.     else
  563.       if (Y < 0) then
  564.         Y := 0;
  565.   end;
  566. end; { MoveSaucer }
  567.  
  568. var
  569.   Pausetime : word;
  570.   Saucer    : pointer;
  571.   X, Y      : integer;
  572.   ulx, uly  : word;
  573.   lrx, lry  : word;
  574.   Size      : word;
  575.   I         : word;
  576. begin
  577.   ClearDevice;
  578.   FullPort;
  579.  
  580.   { PaintScreen }
  581.   ClearDevice;
  582.   MainWindow('GetImage / PutImage Demonstration');
  583.   StatusLine('Esc aborts or press a key...');
  584.   GetViewSettings(CurPort);
  585.  
  586.   { DrawSaucer }
  587.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  588.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  589.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  590.   Circle(StartX+10, StartY-12, 2);
  591.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  592.   Circle(StartX-10, StartY-12, 2);
  593.   SetFillStyle(SolidFill, MaxColor);
  594.   FloodFill(StartX+1, StartY+4, GetColor);
  595.  
  596.   { ReadSaucerImage }
  597.   ulx := StartX-(r+1);
  598.   uly := StartY-14;
  599.   lrx := StartX+(r+1);
  600.   lry := StartY+(r div 3)+3;
  601.  
  602.   Size := ImageSize(ulx, uly, lrx, lry);
  603.   GetMem(Saucer, Size);
  604.   GetImage(ulx, uly, lrx, lry, Saucer^);
  605. {  PutImage(ulx, uly, Saucer^, XORput);               { erase image }
  606.  
  607.   { Plot some "stars" }
  608.   for I := 1 to 1000 do
  609.      PutPixel(Random(MaxX), Random(MaxY), RandColor);
  610.   X := MaxX div 2;
  611.   Y := MaxY div 2;
  612.   PauseTime := 70;
  613.  
  614.   { Move the saucer around }
  615.   repeat
  616. {     PutImage(X, Y, Saucer^, XORput);                 { draw image }
  617.      Delay(PauseTime);
  618. {     PutImage(X, Y, Saucer^, XORput);                 { erase image }
  619.      MoveSaucer(X, Y, lrx - ulx + 1, lry - uly + 1);  { width/height }
  620.   until KeyPressed;
  621.   FreeMem(Saucer, size);
  622.   WaitToGo;
  623. end; { PutImagePlay }
  624.  
  625. procedure PolyPlay;
  626. { Draw random polygons with random fill styles on the screen }
  627. const
  628.   MaxPts = 5;
  629. type
  630.   PolygonType = array[1..MaxPts] of PointType;
  631. var
  632.   Poly : PolygonType;
  633.   I, Color : word;
  634. begin
  635.   MainWindow('FillPoly demonstration');
  636.   StatusLine('Esc aborts or press a key...');
  637.   repeat
  638.     Color := RandColor;
  639.     SetFillStyle(Random(11)+1, Color);
  640.     SetColor(Color);
  641.     for I := 1 to MaxPts do
  642.       with Poly[I] do
  643.       begin
  644.         X := Random(MaxX);
  645.         Y := Random(MaxY);
  646.       end;
  647.     FillPoly(MaxPts, Poly);
  648.   until KeyPressed;
  649.   WaitToGo;
  650. end; { PolyPlay }
  651.  
  652. procedure FillStylePlay;
  653. { Display all of the predefined fill styles available }
  654. var
  655.   Style    : word;
  656.   Width    : word;
  657.   Height   : word;
  658.   X, Y     : word;
  659.   I, J     : word;
  660.   ViewInfo : ViewPortType;
  661.  
  662. procedure DrawBox(X, Y : word);
  663. begin
  664.   SetFillStyle(Style, MaxColor);
  665.   with ViewInfo do
  666.     Bar(X, Y, X+Width, Y+Height);
  667.   Rectangle(X, Y, X+Width, Y+Height);
  668.   OutTextXY(X+(Width div 2), Y+Height+4, Int2Str(Style));
  669.   Inc(Style);
  670. end; { DrawBox }
  671.  
  672. begin
  673.   MainWindow('Pre-defined fill styles');
  674.   GetViewSettings(ViewInfo);
  675.   with ViewInfo do
  676.   begin
  677.     Width := 2 * ((x2+1) div 13);
  678.     Height := 2 * ((y2-10) div 10);
  679.   end;
  680.   X := Width div 2;
  681.   Y := Height div 2;
  682.   Style := 0;
  683.   for J := 1 to 3 do
  684.   begin
  685.     for I := 1 to 4 do
  686.     begin
  687.       DrawBox(X, Y);
  688.       Inc(X, (Width div 2) * 3);
  689.     end;
  690.     X := Width div 2;
  691.     Inc(Y, (Height div 2) * 3);
  692.   end;
  693.   SetTextJustify(LeftText, TopText);
  694.   WaitToGo;
  695. end; { FillStylePlay }
  696.  
  697. procedure FillPatternPlay;
  698. { Display some user defined fill patterns }
  699. const
  700.   Patterns : array[0..11] of FillPatternType = (
  701.   ($AA, $55, $AA, $55, $AA, $55, $AA, $55 üÖü üÖü  !BBäx!!!BBäx!BBäx"""DDêp""DDêp>"""BBääêp""!"BDäêêp>IÉÆ|      ° @≥î>00>><Dêx  !BBäx""DDêp&<"DDêê&22TTêêê$> $< @äêp>          ⁿBBBB<  @@Ç****DDDDDDDU¬U¬U¬U¬U¬U¬U¬▌w▌w▌w▌w▌w▌w▌w°°°≥■°°≥≥■≥≥■■°°°    ≤  ≤  ≤≤         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       ;DDD;    $"Bdÿ>@@@>||>Ac]AAA1N"A""2,  `1NA"*III*<Bü üB<<BüüüB<A" \"QIE" < <BBBB  @@    ~ ?  @ÇB$$B ""A$$"AII6 üBr»$**IIII**ccregion.  The region is defined as any pixel of
  702.             OldColor which has a path of pixels of OldColor or NewColor
  703.             with sides touching back to the seed point, (XSeed, YSeed).
  704.             Therefore, only pixels of OldColor are modified and no other
  705.             information is changed.
  706.  
  707.             SEE ALSO
  708.  
  709.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  710.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  711.             SETVIEW
  712.  
  713.             EXAMPL(HNxHHO$B<BBBB<$<BBBB<<BBBB<$BBBBBF:0BBBBF:$BBBF:B<""AAA""AAAAA"<B@@B<" <2\A">>xDDxDNDD <` <>BB= > <BBBB< BBBBF:2L\bBBBB&AaQIECA8$>""">0@@A>@@@ b$(. b$(*
  714.     $    $    $DDDDDDD¬U¬U¬U¬U¬U¬U¬Uw▌w▌w▌w▌w▌w▌w▌°°°⌠ⁿ°°⌠⌠ⁿ⌠⌠ⁿⁿ°°°    ≈  ≈  ≈≈         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       7HH7"B\DBBRL~BB@@@@@@?R~!!~?DDDD8BBBB|@@Ç>P>III>"AA""AAA"Uw<DDDD86II6"EIQ"\ @@ "AAAAA> >     hH02L2L$$<H(,$<>>>>>>>         VMODE=VIDEOMODEGET
  715.             IF WHICHVGA = 0 THEN STOP
  716.             DUMMY=RES640
  717.             SETVIEW 100, 100, 539, 379
  718.             FILLVIEW 10
  719.             WHILE INKEY$ = ""
  720.             WEND
  721.             VIDEOMODESET VMODE
  722.             END
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.                                                                          63
  740.  
  741.  
  742.  
  743.  
  744.  
  745.           FONTGETINFO
  746.  
  747.             PROTOTYPE
  748.  
  749.             SUB FONTGETINFO (Width%, Height%)
  750.  
  751.             INPUT
  752.  
  753.             no input parameters
  754.     WEND
  755.             MOUSEEXIT
  756.             VIDEOMODESET VMODE
  757.             END
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.  
  797.  
  798.                                                                          86
  799.  
  800.  
  801.  
  802.  
  803.  
  804.           MOUSECURSORDEFAULT
  805.  
  806.             PROTOTYPE
  807.  
  808.             SUB MOUSECURSORDEFAULT ()
  809.  
  810.             INPUT
  811.  
  812.             no input parameters
  813.  
  814.             OUTPUT
  815.  
  816.             no value returned
  817.  
  818.             USAGE
  819.  
  820.             MOUSECURSORDEFAULT defines the mouse cursor to be a small
  821.        ,K$╖┼╘╤░XQ)σ┤ö≡÷┴─┤àñT┘,╘¬àñX9╘⌠àñ\9╘UÜ╢≤`9╘4a╘d9╘UTa╘h9╘ta╘l9╘Uöa╘p9╘┤a╘t┘PT±x┴îÇ╖0▓ïα│ÅαU┤ôα╡ùα╢¢α╖úΓ╘pǺΓ╕¡αë ╚┴πì°sKÉφb<$⌡▌ë     φë φë I1φë  Eφë $YφÆë (mφë ,üφë 0$òφë á⌐φë ñ╜φë I¿╤φë ¼σφë ░∙φÆë 4²ë ┤!²ë ╕$5²ë ╝I²ë └]²ë ⌐8q²ë <àⁿΦiǬ∙PÖÇ ¥Ç
  822. ⁿ░╨â@%8@ΓΦá╝╤░≡cÑÅ*$░╕≡ż≡τ╥m¿⌡ε    ╨@#µ≈$âh$âαra╨à`¥è∩Ç%Ç +─▀ TîcOî∩â°1<@  [$¿Ç¼ MMl·0ƒ Y¼─!%6a▐è ¥ì ßá+?±  P<îaTTV ╪iÇ¡≥░ `_ñ»%Çá᪠P█º»ε`éa∙É%H«┴íA%Gár∙É
  823. iw∙Éiφ`╧≥≡╤Çmⁿ▒
  824. ]ÆAáσw7░⌡∩    $·╟Ç√É&^`  ┐ $ⁿ  $■ $╒ nk$J-ÉQ1£PéBù »0αQ/Ñ4╜£░ºP≈Ñ4Ç⌡$(ª▀$@C]Æé≈└╕_SÇçÑ4=iÉ⌠ä╣<_np@Ñ45ò▒Y3ü¼Qí░.i>╠@5+┴╙É╛╙$@ #┴@«╦
  825. $╤
  826. #@Ñú4,p&e÷ü¼_ÇQºÑ4òQ  ü@;¡_áQ@e╠≥@mp!┤a╘O░√`Pñź ÇT°8ÿ!¼Åñ$½╙"q¿ PñCÇ¿α√└╥░eT"ß<p°%Pæ(╧%pδ¥/OêW0Ǽbφ φ B@[â¼8â≥µ≤(    ¿⌡%(Ç∩áTÿp+ óÜ▓0!Σ±(1±░┤ÖÇD└D0Å╡`   $ «îO@╧1
  827. a╝╤j-0ñ│`@╖bΦaT1═⌠╝╤Σ²¼±,1öíî9lÿ28ÇÅ`Γî¿P²$,N0┴O0a╫δ≤0σú`°î╖#0δ≡└X▄1»Σî(▒¥Ç█Ñ"qá√1CÇú╟╨º Å
  828. FT Θ²î└1ÇY0    w ²à░$@AÅ`╦Φ¼╘`▄1A  }┐Ç*5 ΩSδδî`¼îaδæ¼î5 1¿⌡Ω╜⌠ ¼¥╬ü└Qî1S╛≤î9╨iÇ,∙PU(}Ç$üÇ àÇ`σìÇ`QαÜBO$%ÿÇ╧"$Ç«Ç]É.┬\`%WÉ$  W0 ÄâO0]αG┬ur╩░£▒Q¢ú╔Ç≡°s?`X0╘`@ µWâ@╣aá εdq`¥9?Ç&+o0µyÄΣAÅuV(7P╬±@IdQ╕@Å┤@;Ç▓?Çò│CÇ┤╟╨╡KÇÄ30ⁿφ° ó╬ì+]Ä╦≡     Mö╝σ ²y5<!└▀óâ╝É3~mp    $<╛≤9Æ-2ⁿ≡@T,╞Σa,)Pæ└¥#¼╪Q┤S(¼@Aîa≡╤@Ö²±⌠KëD─┴▒▀0╨Ñ$╩-0 ╨ê*╙▓edm`î=3Kß-10è=≥≤²└£mîjy ÿe²ⁿ╨i╕e▓ΣmαÖ╢C%Ç*ê*0 EátQZ`mÄLP%    °üⁿªüNQ∙  T¿<qtWΩc z░ÅÇñΩçǪçÇ«;└<┐á¼¥. á?<Σscî)áí := 0;
  829.       end;
  830.     end;
  831.   end;
  832.   WaitToGo;
  833. end; { UserLineStylePlay }
  834.  
  835.  
  836. procedure SayGoodbye;
  837. { Say goodbye and then exit the program }
  838. var
  839.   ViewInfo : ViewPortType;
  840. begin
  841.   MainWindow('');
  842.   GetViewSettings(ViewInfo);
  843.   SetTextStyle(TriplexFont, HorizDir, 4);
  844.   SetTextJustify(CenterText, CenterText);
  845.   with ViewInfo do
  846.     OutTextXY((x2-x1) div 2, (y2-y1) div 2, 'That''s all folks!');
  847.   StatusLine('Press any key to quit...');
  848.   repeat until KeyPressed;
  849. end; { SayGoodbye }
  850.  
  851.  
  852. PROCEDURE SelectMode;
  853. VAR
  854.     choice1,choice2     : CHAR;
  855.    xsize,ysize            : WORD;
  856. BEGIN
  857.     (* Let's select a mode *)
  858.     ClrScr;
  859.     WriteLn('VESADEMO:');
  860.     WriteLn('1. 256 colors');
  861.     WriteLn('2. 32768 colors');
  862.     WriteLn('3. 65536 colors');
  863.     WriteLn('4. 16777216 colors');
  864.     WriteLn('Q uit');
  865.     WriteLn;
  866.     Write('Your choice: ');
  867.     REPEAT
  868.         ReadLn(choice1);
  869.       IF choice1 <> '1' THEN BEGIN
  870.           WriteLn('Sorry !');
  871.          WriteLn('This demo wasn''t written for more as 256 colors !');
  872.          WriteLn('You would only get a limited impression of the Hi-& TrueColor modes...');
  873.          WriteLn('Switching to 256 colors.');
  874.          choice1 := '1';
  875.       END;
  876.     UNTIL choice1 IN ['1'..'4','q'];
  877.     IF choice1 = 'q' THEN Halt;
  878.  
  879.     WriteLn;
  880.     WriteLn;
  881.     WriteLn('a. 320x200');
  882.     WriteLn('b. 640x480');
  883.     WriteLn('c. 800x600');
  884.     WriteLn('d. 1024x768');
  885.     WriteLn('e. 1280x1024');
  886.     WriteLn('Q uit');
  887.     WriteLn;
  888.     Write('Your choice: ');
  889.     REPEAT
  890.         ReadLn(choice2);
  891.     UNTIL choice2 IN ['a'..'e','q'];
  892.     IF choice2 = 'q' THEN Halt;
  893.  
  894.     CASE choice2 OF
  895.         'a' : BEGIN
  896.             xsize := 320;
  897.             ysize := 200;
  898.         END;
  899.         'b' : BEGIN
  900.             xsize := 640;
  901.             ysize := 480;
  902.         END;
  903.         'c' : BEGIN
  904.             xsize := 800;
  905.             ysize := 600;
  906.         END;
  907.         'd' : BEGIN
  908.             xsize := 1024;
  909.             ysize := 768;
  910.         END;
  911.         'e' : BEGIN
  912.             xsize := 1280;
  913.             ysize := 1024;
  914.         END;
  915.     END;
  916.     CASE choice1 OF
  917.         '1' : mode := FindVesaMode(xsize,ysize,8);
  918.         '2' : mode := FindVesaMode(xsize,ysize,15);
  919.         '3' : mode := FindVesaMode(xsize,ysize,16);
  920.         '4' : mode := FindVesaMode(xsize,ysize,24);
  921.     END;
  922.     IF mode = 0 THEN BEGIN
  923.         WriteLn('No such mode could be found !');
  924.         WriteLn('Switching to to 320x200.');
  925.         ReadKey;
  926.         mode := V320x200x256;
  927.     END;
  928. END;
  929.  
  930. begin { program body }
  931.   SelectMode;
  932.   Initialize;
  933.   ReportStatus;
  934.  
  935. {  AspectRatioPlay; }
  936.   FillEllipsePlay;
  937.   SectorPlay;
  938.   WriteModePlay;
  939.  
  940.   ColorPlay;
  941.   { PalettePlay only intended to work on these drivers: }
  942.   if (GraphDriver = EGA) or
  943.       (GraphDriver = EGA64) or
  944.       (GraphDriver = VGA) then
  945.      PalettePlay;
  946.   PutPixelPlay;
  947. {  PutImagePlay; }
  948.   RandBarPlay;
  949.   BarPlay;
  950.   Bar3DPlay;
  951.   ArcPlay;
  952.   CirclePlay;
  953.   PiePlay;
  954.   LineToPlay;
  955.   LineRelPlay;
  956. {  LineStylePlay; }
  957. {  UserLineStylePlay; }
  958.   TextDump;
  959.   TextPlay;
  960.   CrtModePlay;
  961.   FillStylePlay;
  962.   FillPatternPlay;
  963.   PolyPlay;
  964.   SayGoodbye;
  965. {  CloseGraph; }
  966.   CloseVesa;
  967. end.
  968. ***************************************************
  969.     '* SHOW D2ROTATE (ABOUT THE ORIGIN)
  970.     '****************************************************************∞╥≤c≤*φè#^│v/╒:j═φ0t+l▓ô"¬"g└≡?%ªêΣ│H╫½╫╜├¿U'╒⌐⌡ ßV?╩¬ujOΦçEZ1∞▐! ▄B╛Σ8║æ]1GlNÜ┐q▌▓;ô$ΦzE<cª*bEô#ä╧ñÅ"∩─LrdaÖ ╠º╫a^¥£å╬1~)@ëÖMδ╫0═6DäFê¬Çv┼ß╨kæpτ╪É)}ª 1w3╤╧ü⌡¥╓h▓╣≈ïÅaÑ[TⁿHqªÉ╝DKÄ─Y-∞tT╤Θ╨º╟╪.*ÇI9lΦ≈{πτcσ$τπßoFr╪╨∩┼╞╟;O2■e²LÜ4^N|╪½ÅO?╔°FOz`╟╟╟'<>>π$πΘù6·Xgî╖│°oîδπGƒd╝▀░?■╪╔_9L ⌡ôⁿq'æO▀ƒn4╔▀╚▄┼3pτ.òO°·}÷╕ⁿ±'æO?ít│!√8ßÑ≤/┐╣p┼≥┘E╦Vox╕cΦé5╟╚º╙$?√$≥ΘZεsî≡åìΓpKù¢ïß X╥ 9╞≈\µk┤O¥_ 5Üö\≤éÄ┌╤A[╤ÿáï┼éNⁿÅu16    g,%hc╙╨cD╨Vï┘R¢öKñR;8εáΣ╢╪ós╤π╡á└èxgzPÄMú╫yαºÉ+σJ¢i+▓â3╥    ═Ñ╙î^ºG▓█πérφçs %#(╗⌠?┼%u8≡6+QÉ))ò)Afw≈╣╪)B&4░åLXV:δät@Å.;5Φf╢Ät┐ΣJ╫─U8úÇ╟éö£╕p╔┴⌠vg╨╬╥é÷╪╣┬ΓI.ç≡^v╤ZΦÇ& ╒┌6ñô6XßNè╡╬E₧Ñ
  971. kIº╠▄A+╣╥éb²tæ-Y¡½αÑa═uuîÇ╢αêvhuª╡SÅ┤vèùú¥F;p<d⌐/F─d█éT%▓KΦû=q■öI┐ ┐╠6S$▒÷╚ENΩ¥Fû9╔┌R'╝ ╧φ└?g┬j▓0═/b╖₧─mûé╢┌»ÿÄë/·<éò■░╤╟╢├Xσ:╥P3Θ"╬Læsφ░┌öSö!╗¿*mN£WΣÇ£┤~#╗ææ≥RΩóh:à▌.æ≈╕▌v£äàd▒à╒├=░╖π║$howeg*╬    6ù▄ƒô╕φ░Ö╢qΘD>(w@úKεHÆ╛öúΣU
  972. éÜR╔╤W▄èê 2M%ó.▓SNÖA1ùJE╢║l]▓¿>\%└Å4ßO▄£â⌐& ê/)8vSP▀▓ôⁿææ√ü√ÑÄa⌠â╚4S╓╟P- ?Σá╕▓Næ*q╡UΘ▓≈^ñ·I.rúR&$Y^╚%è≡B┌≈Ceat
  973.     Color := RandColor;
  974.     SetColor(Color);
  975.     SetFillStyle(Random(CloseDotFill)+1, Color);
  976.     Bar3D(Random(MaxWidth), Random(MaxHeight),
  977.           Random(MaxWidth), Random(MaxHeight), 0, TopOff);
  978.   until KeyPressed;
  979.   WaitToGo;
  980. end; { RandBarPlay }
  981.  
  982. procedure ArcPlay;
  983. { Draw random arcs on the screen }
  984. var
  985.   MaxRadius : word;
  986.   EndAngle : word;
  987.   ArcInfo : ArcCoordsType;
  988. begin
  989.   MainWindow('Arc / GetArcCoords demonstration');
  990.   StatusLine('Esc aborts or press a key');
  991.   MaxRadius := MaxY div 10;
  992.   repeat
  993.     SetColor(RandColor);
  994.     EndAngle := Random(360);
  995.     SetLineStyle(SolidLn, 0, NormWidth);
  996.     Arc(Random(MaxX), Random(MaxY), Random(EndAngle), EndAngle, Random(MaxRadius));
  997.     GetArcCoords(ArcInfo);
  998.     with ArcInfo do
  999.     begin
  1000.       Line(X, Y, XStart, YStart);
  1001.       Line(X, Y, Xend, Yend);
  1002.     end;
  1003.   until KeyPressed;
  1004.   WaitToGo;
  1005. end; { ArcPlay }
  1006.  
  1007. procedure PutPixelPlay;
  1008. { Demonstrate the PutPixel and GetPixel commands }
  1009. const
  1010.   Seed   = 1962; { A seed for the random number generator }
  1011.   NumPts = 2000; { The number of pixels plotted }
  1012.   Esc    = #27;
  1013. var
  1014.   I : word;
  1015.   X, Y, Color : word;
  1016.   XMax, YMax  : integer;
  1017.   ViewInfo    : ViewPortType;
  1018. begin
  1019.   MainWindow('PutPixel / GetPixel demonstration');
  1020.   StatusLine('Esc aborts or press a key...');
  1021.  
  1022.   GetViewSettings(ViewInfo);
  1023.   with ViewInfo do
  1024.   begin
  1025.     XMax := (x2-x1-1);
  1026.     YMax := (y2-y1-1);
  1027.   end;
  1028.  
  1029.   while not KeyPressed do
  1030.   begin
  1031.     { Plot random pixels }
  1032.     RandSeed := Seed;
  1033.     I := 0;
  1034.     while (not KeyPressed) and (I < NumPts) do
  1035.     begin
  1036.       Inc(I);
  1037.         PutPixel(Random(XMax)+1, Random(YMax)+1, RandColor);
  1038.     end;
  1039.  
  1040.     { Erase pixels }
  1041.     RandSeed := Seed;
  1042.     I := 0;
  1043.     while (not KeyPressed) and (I < NumPts) do
  1044.     begin
  1045.       Inc(I);
  1046.       X := Random(XMax)+1;
  1047.       Y := Random(YMax)+1;
  1048.       Color := GetPixel(X, Y);
  1049.         if Color = RandColor then
  1050.           PutPixel(X, Y, 0);
  1051.      end;
  1052.   end;
  1053.   WaitToGo;
  1054. end; { PutPixelPlay }
  1055.  
  1056. procedure PutImagePlay;
  1057. { Demonstrate the GetImage and PutImage commands }
  1058.  
  1059. const
  1060.   r  = 20;
  1061.   StartX = 100;
  1062.   StartY = 50;
  1063.  
  1064. var
  1065.   CurPort : ViewPortType;
  1066.  
  1067. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  1068. var
  1069.   Step : integer;
  1070. begin
  1071.   Step := Random(2*r);
  1072.   if Odd(Step) then
  1073.     Step := -Step;
  1074.   X := X + Step;
  1075.   Step := Random(r);
  1076.   if Odd(Step) then
  1077.     Step := -Step;
  1078.   Y := Y + Step;
  1079.  
  1080.   { Make saucer bounce off viewport walls }
  1081.   with CurPort do
  1082.   begin
  1083.     if (x1 + X + Width - 1 > x2) then
  1084.       X := x2-x1 - Width + 1
  1085.     else
  1086.       if (X < 0) then
  1087.         X := 0;
  1088.     if (y1 + Y + Height - 1 > y2) then
  1089.       Y := y2-y1 - Height + 1
  1090.     else
  1091.       if (Y < 0) then
  1092.         Y := 0;
  1093.   end;
  1094. end; { MoveSaucer }
  1095.  
  1096. var
  1097.   Pausetime : word;
  1098.   Saucer    : pointer;
  1099.   X, Y      : integer;
  1100.   ulx, uly  : word;
  1101.   lrx, lry  : word;
  1102.   Size      : word;
  1103.   I         : word;
  1104. begin
  1105.   ClearDevice;
  1106.   FullPort;
  1107.  
  1108.   { PaintScreen }
  1109.   ClearDevice;
  1110.   MainWindow('GetImage / PutImage Demonstration');
  1111.   StatusLine('Esc aborts or press a key...');
  1112.   GetViewSettings(CurPort);
  1113.  
  1114.   { DrawSaucer }
  1115.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  1116.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  1117.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  1118.   Circle(StartX+10, StartY-12, 2);
  1119.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  1120.   Circle(StartX-10, StartY-12, 2);
  1121.   SetFillStyle(SolidFill, MaxColor);
  1122.   FloodFill(StartX+1, StartY+4, GetColor);
  1123.  
  1124.   { ReadSaucerImage }
  1125.   ulx := StartX-(r+1);
  1126.   uly := StartY-14;
  1127.   lrx := StartX+(r+1);
  1128.   lry := StartY+(r div 3)+3;
  1129.  
  1130.   Size := ImageSize(ulx, uly, lrx, lry);
  1131.   GetMem(Saucer, Size);
  1132.   GetImage(ulx, uly, lrx, lry, Saucer^);
  1133. {  PutImage(ulx, uly, Saucer^, XORput);               { erase image }
  1134.  
  1135.   { Plot some "stars" }
  1136.   for I := 1 to 1000 do
  1137.      PutPixel(Random(MaxX), Random(MaxY), RandColor);
  1138.   X := MaxX div 2;
  1139.   Y := MaxY div 2;
  1140.   PauseTime := 70;
  1141.  
  1142.   { Move the saucer around }
  1143.   repeat
  1144. {     PutImage(X, Y, Saucer^, XORput);                 { draw image }
  1145.      Delay(PauseTime);
  1146. {     PutImage(X, Y, Saucer^, XORput);                 { erase image }
  1147.      MoveSaucer(X, Y, lrx - ulx + 1, lry - uly + 1);  { width/height }
  1148.   until KeyPressed;
  1149.   FreeMem(Saucer, size);
  1150.   WaitToGo;
  1151. end; { PutImagePlay }
  1152.  
  1153. procedure PolyPlay;
  1154. { Draw random polygons with random fill styles on the screen }
  1155. const
  1156.   MaxPts = 5;
  1157. type
  1158.   PolygonType = array[1..MaxPts] of PointType;
  1159. var
  1160.   Poly : PolygonType;
  1161.   I, Color : word;
  1162. begin
  1163.   MainWindow('FillPoly demonstration');
  1164.   StatusLine('Esc aborts or press a key...');
  1165.   repeat
  1166.     Color := RandColor;
  1167.     SetFillStyle(Random(11)+1, Color);
  1168.     SetColor(Color);
  1169.     for I := 1 to MaxPts do
  1170.       with Poly[I] do
  1171.       begin
  1172.         X := Random(MaxX);
  1173.         Y := Random(MaxY);
  1174.       end;
  1175.     FillPoly(MaxPts, Poly);
  1176.   until KeyPressed;
  1177.   WaitToGo;
  1178. end; { PolyPlay }
  1179.  
  1180. procedure FillStylePlay;
  1181. { Display all of the predefined fill styles available }
  1182. var
  1183.   Style    : word;
  1184.   Width    : word;
  1185.   Height   : word;
  1186.   X, Y     : word;
  1187.   I, J     : word;
  1188.   ViewInfo : ViewPortType;
  1189.  
  1190. procedure DrawBox(X, Y : word);
  1191. begin
  1192.   SetFillStyle(Style, MaxColor);
  1193.   with ViewInfo do
  1194.     Bar(X, Y, X+Width, Y+Height);
  1195.   Rectangle(X, Y, X+Width, Y+Height);
  1196.   OutTextXY(X+(Width div 2), Y+Height+4, Int2Str(Style));
  1197.   Inc(Style);
  1198. end; { DrawBox }
  1199.  
  1200. begin
  1201.   MainWindow('Pre-defined fill styles');
  1202.   GetViewSettings(ViewInfo);
  1203.   with ViewInfo do
  1204.   begin
  1205.     Width := 2 * ((x2+1) div 13);
  1206.     Height := 2 * ((y2-10) div 10);
  1207.   end;
  1208.   X := Width div 2;
  1209.   Y := Height div 2;
  1210.   Style := 0;
  1211.   for J := 1 to 3 do
  1212.   begin
  1213.     for I := 1 to 4 do
  1214.     begin
  1215.       DrawBox(X, Y);
  1216.       Inc(X, (Width div 2) * 3);
  1217.     end;
  1218.     X := Width div 2;
  1219.     Inc(Y, (Height div 2) * 3);
  1220.   end;
  1221.   SetTextJustify(LeftText, TopText);
  1222.   WaitToGo;
  1223. end; { FillStylePlay }
  1224.  
  1225. procedure FillPatternPlay;
  1226. { Display some user defined fill patterns }
  1227. const
  1228.   Patterns : array[0..11] of FillPatternType = (
  1229.   ($AA, $55, $AA, $55, $AA, $55, $AA, $55 üÖü üÖü  !BBäx!!!BBäx!BBäx"""DDêp""DDêp>"""BBääêp""!"BDäêêp>IÉÆ|      ° @≥î>00>><Dêx  !BBäx""DDêp&<"DDêê&22TTêêê$> $< @äêp>          ⁿBBBB<  @@Ç****DDDDDDDU¬U¬U¬U¬U¬U¬U¬▌w▌w▌w▌w▌w▌w▌w°°°≥■°°≥≥■≥≥■■°°°    ≤  ≤  ≤≤         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       ;DDD;    $"Bdÿ>@@@>||>Ac]AAA1N"A""2,  `1NA"*III*<Bü üB<<BüüüB<A" \"QIE" < <BBBB  @@    ~ ?  @ÇB$$B ""A$$"AII6 üBr»$**IIII**ccregion.  The region is defined as any pixel of
  1230.             OldColor which has a path of pixels of OldColor or NewColor
  1231.             with sides touching back to the seed point, (XSeed, YSeed).
  1232.             Therefore, only pixels of OldColor are modified and no other
  1233.             information is changed.
  1234.  
  1235.             SEE ALSO
  1236.  
  1237.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  1238.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  1239.             SETVIEW
  1240.  
  1241.             EXAMPL(HNxHHO$B<BBBB<$<BBBB<<BBBB<$BBBBBF:0BBBBF:$BBBF:B<""AAA""AAAAA"<B@@B<" <2\A">>xDDxDNDD <` <>BB= > <BBBB< BBBBF:2L\bBBBB&AaQIECA8$>""">0@@A>@@@ b$(. b$(*
  1242.     $    $    $DDDDDDD¬U¬U¬U¬U¬U¬U¬Uw▌w▌w▌w▌w▌w▌w▌°°°⌠ⁿ°°⌠⌠ⁿ⌠⌠ⁿⁿ°°°    ≈  ≈  ≈≈         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       7HH7"B\DBBRL~BB@@@@@@?R~!!~?DDDD8BBBB|@@Ç>P>III>"AA""AAA"Uw<DDDD86II6"EIQ"\ @@ "AAAAA> >     hH02L2L$$<H(,$<>>>>>>>         VMODE=VIDEOMODEGET
  1243.             IF WHICHVGA = 0 THEN STOP
  1244.             DUMMY=RES640
  1245.             SETVIEW 100, 100, 539, 379
  1246.             FILLVIEW 10
  1247.             WHILE INKEY$ = ""
  1248.             WEND
  1249.             VIDEOMODESET VMODE
  1250.             END
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258.  
  1259.  
  1260.  
  1261.  
  1262.  
  1263.  
  1264.  
  1265.  
  1266.  
  1267.                                                                          63
  1268.  
  1269.  
  1270.  
  1271.  
  1272.  
  1273.           FONTGETINFO
  1274.  
  1275.             PROTOTYPE
  1276.  
  1277.             SUB FONTGETINFO (Width%, Height%)
  1278.  
  1279.             INPUT
  1280.  
  1281.             no input parameters
  1282.     WEND
  1283.             MOUSEEXIT
  1284.             VIDEOMODESET VMODE
  1285.             END
  1286.  
  1287.  
  1288.  
  1289.  
  1290.  
  1291.  
  1292.  
  1293.  
  1294.  
  1295.  
  1296.  
  1297.  
  1298.  
  1299.  
  1300.  
  1301.  
  1302.  
  1303.  
  1304.  
  1305.  
  1306.  
  1307.  
  1308.  
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.  
  1324.  
  1325.  
  1326.                                                                          86
  1327.  
  1328.  
  1329.  
  1330.  
  1331.  
  1332.           MOUSECURSORDEFAULT
  1333.  
  1334.             PROTOTYPE
  1335.  
  1336.             SUB MOUSECURSORDEFAULT ()
  1337.  
  1338.             INPUT
  1339.  
  1340.             no input parameters
  1341.  
  1342.             OUTPUT
  1343.  
  1344.             no value returned
  1345.  
  1346.             USAGE
  1347.  
  1348.             MOUSECURSORDEFAULT defines the mouse cursor to be a small
  1349.        ,K$╖┼╘╤░XQ)σ┤ö≡÷┴─┤àñT┘,╘¬àñX9╘⌠àñ\9╘UÜ╢≤`9╘4a╘d9╘UTa╘h9╘ta╘l9╘Uöa╘p9╘┤a╘t┘PT±x┴îÇ╖0▓ïα│ÅαU┤ôα╡ùα╢¢α╖úΓ╘pǺΓ╕¡αë ╚┴πì°sKÉφb<$⌡▌ë     φë φë I1φë  Eφë $YφÆë (mφë ,üφë 0$òφë á⌐φë ñ╜φë I¿╤φë ¼σφë ░∙φÆë 4²ë ┤!²ë ╕$5²ë ╝I²ë └]²ë ⌐8q²ë <àⁿΦiǬ∙PÖÇ ¥Ç
  1350. ⁿ░╨â@%8@ΓΦá╝╤░≡cÑÅ*$░╕≡ż≡τ╥m¿⌡ε    ╨@#µ≈$âh$âαra╨à`¥è∩Ç%Ç +─▀ TîcOî∩â°1<@  [$¿Ç¼ MMl·0ƒ Y¼─!%6a▐è ¥ì ßá+?±  P<îaTTV ╪iÇ¡≥░ `_ñ»%Çá᪠P█º»ε`éa∙É%H«┴íA%Gár∙É
  1351. iw∙Éiφ`╧≥≡╤Çmⁿ▒
  1352. ]ÆAáσw7░⌡∩    $·╟Ç√É&^`  ┐ $ⁿ  $■ $╒ nk$J-ÉQ1£PéBù »0αQ/Ñ4╜£░ºP≈Ñ4Ç⌡$(ª▀$@C]Æé≈└╕_SÇçÑ4=iÉ⌠ä╣<_np@Ñ45ò▒Y3ü¼Qí░.i>╠@5+┴╙É╛╙$@ #┴@«╦
  1353. $╤
  1354. #@Ñú4,p&e÷ü¼_ÇQºÑ4òQ  ü@;¡_áQ@e╠≥@mp!┤a╘O░√`Pñź ÇT°8ÿ!¼Åñ$½╙"q¿ PñCÇ¿α√└╥░eT"ß<p°%Pæ(╧%pδ¥/OêW0Ǽbφ φ B@[â¼8â≥µ≤(    ¿⌡%(Ç∩áTÿp+ óÜ▓0!Σ±(1±░┤ÖÇD└D0Å╡`   $ «îO@╧1
  1355. a╝╤j-0ñ│`@╖bΦaT1═⌠╝╤Σ²¼±,1öíî9lÿ28ÇÅ`Γî¿P²$,N0┴O0a╫δ≤0σú`°î╖#0δ≡└X▄1»Σî(▒¥Ç█Ñ"qá√1CÇú╟╨º Å
  1356. FT Θ²î└1ÇY0    w ²à░$@AÅ`╦Φ¼╘`▄1A  }┐Ç*5 ΩSδδî`¼îaδæ¼î5 1¿⌡Ω╜⌠ ¼¥╬ü└Qî1S╛≤î9╨iÇ,∙PU(}Ç$üÇ àÇ`σìÇ`QαÜBO$%ÿÇ╧"$Ç«Ç]É.┬\`%WÉ$  W0 ÄâO0]αG┬ur╩░£▒Q¢ú╔Ç≡°s?`X0╘`@ µWâ@╣aá εdq`¥9?Ç&+o0µyÄΣAÅuV(7P╬±@IdQ╕@Å┤@;Ç▓?Çò│CÇ┤╟╨╡KÇÄ30ⁿφ° ó╬ì+]Ä╦≡     Mö╝σ ²y5<!└▀óâ╝É3~mp    $<╛≤9Æ-2ⁿ≡@T,╞Σa,)Pæ└¥#¼╪Q┤S(¼@Aîa≡╤@Ö²±⌠KëD─┴▒▀0╨Ñ$╩-0 ╨ê*╙▓edm`î=3Kß-10è=≥≤²└£mîjy ÿe²ⁿ╨i╕e▓ΣmαÖ╢C%Ç*ê*0 EátQZ`mÄLP%    °üⁿªüNQ∙  T¿<qtWΩc z░ÅÇñΩçǪçÇ«;└<┐á¼¥. á?<Σscî)áí := 0;
  1357.       end;
  1358.     end;
  1359.   end;
  1360.   WaitToGo;
  1361. end; { UserLineStylePlay }
  1362.  
  1363.  
  1364. procedure SayGoodbye;
  1365. { Say goodbye and then exit the program }
  1366. var
  1367.   ViewInfo : ViewPortType;
  1368. begin
  1369.   MainWindow('');
  1370.   GetViewSettings(ViewInfo);
  1371.   SetTextStyle(TriplexFont, HorizDir, 4);
  1372.   SetTextJustify(CenterText, CenterText);
  1373.   with ViewInfo do
  1374.     OutTextXY((x2-x1) div 2, (y2-y1) div 2, 'That''s all folks!');
  1375.   StatusLine('Press any key to quit...');
  1376.   repeat until KeyPressed;
  1377. end; { SayGoodbye }
  1378.  
  1379.  
  1380. PROCEDURE SelectMode;
  1381. VAR
  1382.     choice1,choice2     : CHAR;
  1383.    xsize,ysize            : WORD;
  1384. BEGIN
  1385.     (* Let's select a mode *)
  1386.     ClrScr;
  1387.     WriteLn('VESADEMO:');
  1388.     WriteLn('1. 256 colors');
  1389.     WriteLn('2. 32768 colors');
  1390.     WriteLn('3. 65536 colors');
  1391.     WriteLn('4. 16777216 colors');
  1392.     WriteLn('Q uit');
  1393.     WriteLn;
  1394.     Write('Your choice: ');
  1395.     REPEAT
  1396.         ReadLn(choice1);
  1397.       IF choice1 <> '1' THEN BEGIN
  1398.           WriteLn('Sorry !');
  1399.          WriteLn('This demo wasn''t written for more as 256 colors !');
  1400.          WriteLn('You would only get a limited impression of the Hi-& TrueColor modes...');
  1401.          WriteLn('Switching to 256 colors.');
  1402.          choice1 := '1';
  1403.       END;
  1404.     UNTIL choice1 IN ['1'..'4','q'];
  1405.     IF choice1 = 'q' THEN Halt;
  1406.  
  1407.     WriteLn;
  1408.     WriteLn;
  1409.     WriteLn('a. 320x200');
  1410.     WriteLn('b. 640x480');
  1411.     WriteLn('c. 800x600');
  1412.     WriteLn('d. 1024x768');
  1413.     WriteLn('e. 1280x1024');
  1414.     WriteLn('Q uit');
  1415.     WriteLn;
  1416.     Write('Your choice: ');
  1417.     REPEAT
  1418.         ReadLn(choice2);
  1419.     UNTIL choice2 IN ['a'..'e','q'];
  1420.     IF choice2 = 'q' THEN Halt;
  1421.  
  1422.     CASE choice2 OF
  1423.         'a' : BEGIN
  1424.             xsize := 320;
  1425.             ysize := 200;
  1426.         END;
  1427.         'b' : BEGIN
  1428.             xsize := 640;
  1429.             ysize := 480;
  1430.         END;
  1431.         'c' : BEGIN
  1432.             xsize := 800;
  1433.             ysize := 600;
  1434.         END;
  1435.         'd' : BEGIN
  1436.             xsize := 1024;
  1437.             ysize := 768;
  1438.         END;
  1439.         'e' : BEGIN
  1440.             xsize := 1280;
  1441.             ysize := 1024;
  1442.         END;
  1443.     END;
  1444.     CASE choice1 OF
  1445.         '1' : mode := FindVesaMode(xsize,ysize,8);
  1446.         '2' : mode := FindVesaMode(xsize,ysize,15);
  1447.         '3' : mode := FindVesaMode(xsize,ysize,16);
  1448.         '4' : mode := FindVesaMode(xsize,ysize,24);
  1449.     END;
  1450.     IF mode = 0 THEN BEGIN
  1451.         WriteLn('No such mode could be found !');
  1452.         WriteLn('Switching to to 320x200.');
  1453.         ReadKey;
  1454.         mode := V320x200x256;
  1455.     END;
  1456. END;
  1457.  
  1458. begin { program body }
  1459.   SelectMode;
  1460.   Initialize;
  1461.   ReportStatus;
  1462.  
  1463. {  AspectRatioPlay; }
  1464.   FillEllipsePlay;
  1465.   SectorPlay;
  1466.   WriteModePlay;
  1467.  
  1468.   ColorPlay;
  1469.   { PalettePlay only intended to work on these drivers: }
  1470.   if (GraphDriver = EGA) or
  1471.       (GraphDriver = EGA64) or
  1472.       (GraphDriver = VGA) then
  1473.      PalettePlay;
  1474.   PutPixelPlay;
  1475. {  PutImagePlay; }
  1476.   RandBarPlay;
  1477.   BarPlay;
  1478.   Bar3DPlay;
  1479.   ArcPlay;
  1480.   CirclePlay;
  1481.   PiePlay;
  1482.   LineToPlay;
  1483.   LineRelPlay;
  1484. {  LineStylePlay; }
  1485. {  UserLineStylePlay; }
  1486.   TextDump;
  1487.   TextPlay;
  1488.   CrtModePlay;
  1489.   FillStylePlay;
  1490.   FillPatternPlay;
  1491.   PolyPlay;
  1492.   SayGoodbye;
  1493. {  CloseGraph; }
  1494.   CloseVesa;
  1495. end.
  1496. ***************************************************
  1497.     '* SHOW D2ROTATE (ABOUT THE ORIGIN)
  1498.     '****************************************************************∞╥≤c≤*φè#^│v/╒:j═φ0t+l▓ô"¬"g└≡?%ªêΣ│H╫½╫╜├¿U'╒⌐⌡ ßV?╩¬ujOΦçEZ1∞▐! ▄B╛Σ8║æ]1GlNÜ┐q▌▓;ô$ΦzE<cª*bEô#ä╧ñÅ"∩─LrdaÖ ╠º╫a^¥£å╬1~)@ëÖMδ╫0═6DäFê¬Çv┼ß╨kæpτ╪É)}ª 1w3╤╧ü⌡¥╓h▓╣≈ïÅaÑ[TⁿHqªÉ╝DKÄ─Y-∞tT╤Θ╨º╟╪.*ÇI9lΦ≈{πτcσ$τπßoFr╪╨∩┼╞╟;O2■e²LÜ4^N|╪½ÅO?╔°FOz`╟╟╟'<>>π$πΘù6·Xgî╖│°oîδπGƒd╝▀░?■╪╔_9L ⌡ôⁿq'æO▀ƒn4╔▀╚▄┼3pτ.òO°·}÷╕ⁿ±'æO?ít│!√8ßÑ≤/┐╣p┼≥┘E╦Vox╕cΦé5╟╚º╙$?√$≥ΘZεsî≡åìΓpKù¢ïß X╥ 9╞≈\µk┤O¥_ 5Üö\≤éÄ┌╤A[╤ÿáï┼éNⁿÅu16    g,%hc╙╨cD╨Vï┘R¢öKñR;8εáΣ╢╪ós╤π╡á└èxgzPÄMú╫yαºÉ+σJ¢i+▓â3╥    ═Ñ╙î^ºG▓█πérφçs %#(╗⌠?┼%u8≡6+QÉ))ò)Afw≈╣╪)B&4░åLXV:δät@Å.;5Φf╢Ät┐ΣJ╫─U8úÇ╟éö£╕p╔┴⌠vg╨╬╥é÷╪╣┬ΓI.ç≡^v╤ZΦÇ& ╒┌6ñô6XßNè╡╬E₧Ñ
  1499. kIº╠▄A+╣╥éb²tæ-Y¡½αÑa═uuîÇ╢αêvhuª╡SÅ┤vèùú¥F;p<d⌐/F─d█éT%▓KΦû=q■öI┐ ┐╠6S$▒÷╚ENΩ¥Fû9╔┌R'╝ ╧φ└?g┬j▓0═/b╖₧─mûé╢┌»ÿÄë/·<éò■░╤╟╢├Xσ:╥P3Θ"╬Læsφ░┌öSö!╗¿*mN£WΣÇ£┤~#╗ææ≥RΩóh:à▌.æ≈╕▌v£äàd▒à╒├=░╖π║$howeg*╬    6ù▄ƒô╕φ░Ö╢qΘD>(w@úKεHÆ╛öúΣU
  1500. éÜR╔╤W▄èê 2M%ó.▓SNÖA1ùJE╢║l]▓¿>\%└Å4ßO▄£â⌐& ê/)8vSP▀▓ôⁿææ√ü√ÑÄa⌠â╚4S╓╟P- ?Σá╕▓Næ*q╡UΘ▓≈^ñ·I.rúR&$Y^╚%è≡B┌≈Ceat
  1501.     Color := RandColor;
  1502.     SetColor(Color);
  1503.     SetFillStyle(Random(CloseDotFill)+1, Color);
  1504.     Bar3D(Random(MaxWidth), Random(MaxHeight),
  1505.           Random(MaxWidth), Random(MaxHeight), 0, TopOff);
  1506.   until KeyPressed;
  1507.   WaitToGo;
  1508. end; { RandBarPlay }
  1509.  
  1510. procedure ArcPlay;
  1511. { Draw random arcs on the screen }
  1512. var
  1513.   MaxRadius : word;
  1514.   EndAngle : word;
  1515.   ArcInfo : ArcCoordsType;
  1516. begin
  1517.   MainWindow('Arc / GetArcCoords demonstration');
  1518.   StatusLine('Esc aborts or press a key');
  1519.   MaxRadius := MaxY div 10;
  1520.   repeat
  1521.     SetColor(RandColor);
  1522.     EndAngle := Random(360);
  1523.     SetLineStyle(SolidLn, 0, NormWidth);
  1524.     Arc(Random(MaxX), Random(MaxY), Random(EndAngle), EndAngle, Random(MaxRadius));
  1525.     GetArcCoords(ArcInfo);
  1526.     with ArcInfo do
  1527.     begin
  1528.       Line(X, Y, XStart, YStart);
  1529.       Line(X, Y, Xend, Yend);
  1530.     end;
  1531.   until KeyPressed;
  1532.   WaitToGo;
  1533. end; { ArcPlay }
  1534.  
  1535. procedure PutPixelPlay;
  1536. { Demonstrate the PutPixel and GetPixel commands }
  1537. const
  1538.   Seed   = 1962; { A seed for the random number generator }
  1539.   NumPts = 2000; { The number of pixels plotted }
  1540.   Esc    = #27;
  1541. var
  1542.   I : word;
  1543.   X, Y, Color : word;
  1544.   XMax, YMax  : integer;
  1545.   ViewInfo    : ViewPortType;
  1546. begin
  1547.   MainWindow('PutPixel / GetPixel demonstration');
  1548.   StatusLine('Esc aborts or press a key...');
  1549.  
  1550.   GetViewSettings(ViewInfo);
  1551.   with ViewInfo do
  1552.   begin
  1553.     XMax := (x2-x1-1);
  1554.     YMax := (y2-y1-1);
  1555.   end;
  1556.  
  1557.   while not KeyPressed do
  1558.   begin
  1559.     { Plot random pixels }
  1560.     RandSeed := Seed;
  1561.     I := 0;
  1562.     while (not KeyPressed) and (I < NumPts) do
  1563.     begin
  1564.       Inc(I);
  1565.         PutPixel(Random(XMax)+1, Random(YMax)+1, RandColor);
  1566.     end;
  1567.  
  1568.     { Erase pixels }
  1569.     RandSeed := Seed;
  1570.     I := 0;
  1571.     while (not KeyPressed) and (I < NumPts) do
  1572.     begin
  1573.       Inc(I);
  1574.       X := Random(XMax)+1;
  1575.       Y := Random(YMax)+1;
  1576.       Color := GetPixel(X, Y);
  1577.         if Color = RandColor then
  1578.           PutPixel(X, Y, 0);
  1579.      end;
  1580.   end;
  1581.   WaitToGo;
  1582. end; { PutPixelPlay }
  1583.  
  1584. procedure PutImagePlay;
  1585. { Demonstrate the GetImage and PutImage commands }
  1586.  
  1587. const
  1588.   r  = 20;
  1589.   StartX = 100;
  1590.   StartY = 50;
  1591.  
  1592. var
  1593.   CurPort : ViewPortType;
  1594.  
  1595. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  1596. var
  1597.   Step : integer;
  1598. begin
  1599.   Step := Random(2*r);
  1600.   if Odd(Step) then
  1601.     Step := -Step;
  1602.   X := X + Step;
  1603.   Step := Random(r);
  1604.   if Odd(Step) then
  1605.     Step := -Step;
  1606.   Y := Y + Step;
  1607.  
  1608.   { Make saucer bounce off viewport walls }
  1609.   with CurPort do
  1610.   begin
  1611.     if (x1 + X + Width - 1 > x2) then
  1612.       X := x2-x1 - Width + 1
  1613.     else
  1614.       if (X < 0) then
  1615.         X := 0;
  1616.     if (y1 + Y + Height - 1 > y2) then
  1617.       Y := y2-y1 - Height + 1
  1618.     else
  1619.       if (Y < 0) then
  1620.         Y := 0;
  1621.   end;
  1622. end; { MoveSaucer }
  1623.  
  1624. var
  1625.   Pausetime : word;
  1626.   Saucer    : pointer;
  1627.   X, Y      : integer;
  1628.   ulx, uly  : word;
  1629.   lrx, lry  : word;
  1630.   Size      : word;
  1631.   I         : word;
  1632. begin
  1633.   ClearDevice;
  1634.   FullPort;
  1635.  
  1636.   { PaintScreen }
  1637.   ClearDevice;
  1638.   MainWindow('GetImage / PutImage Demonstration');
  1639.   StatusLine('Esc aborts or press a key...');
  1640.   GetViewSettings(CurPort);
  1641.  
  1642.   { DrawSaucer }
  1643.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  1644.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  1645.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  1646.   Circle(StartX+10, StartY-12, 2);
  1647.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  1648.   Circle(StartX-10, StartY-12, 2);
  1649.   SetFillStyle(SolidFill, MaxColor);
  1650.   FloodFill(StartX+1, StartY+4, GetColor);
  1651.  
  1652.   { ReadSaucerImage }
  1653.   ulx := StartX-(r+1);
  1654.   uly := StartY-14;
  1655.   lrx := StartX+(r+1);
  1656.   lry := StartY+(r div 3)+3;
  1657.  
  1658.   Size := ImageSize(ulx, uly, lrx, lry);
  1659.   GetMem(Saucer, Size);
  1660.   GetImage(ulx, uly, lrx, lry, Saucer^);
  1661. {  PutImage(ulx, uly, Saucer^, XORput);               { erase image }
  1662.  
  1663.   { Plot some "stars" }
  1664.   for I := 1 to 1000 do
  1665.      PutPixel(Random(MaxX), Random(MaxY), RandColor);
  1666.   X := MaxX div 2;
  1667.   Y := MaxY div 2;
  1668.   PauseTime := 70;
  1669.  
  1670.   { Move the saucer around }
  1671.   repeat
  1672. {     PutImage(X, Y, Saucer^, XORput);                 { draw image }
  1673.      Delay(PauseTime);
  1674. {     PutImage(X, Y, Saucer^, XORput);                 { erase image }
  1675.      MoveSaucer(X, Y, lrx - ulx + 1, lry - uly + 1);  { width/height }
  1676.   until KeyPressed;
  1677.   FreeMem(Saucer, size);
  1678.   WaitToGo;
  1679. end; { PutImagePlay }
  1680.  
  1681. procedure PolyPlay;
  1682. { Draw random polygons with random fill styles on the screen }
  1683. const
  1684.   MaxPts = 5;
  1685. type
  1686.   PolygonType = array[1..MaxPts] of PointType;
  1687. var
  1688.   Poly : PolygonType;
  1689.   I, Color : word;
  1690. begin
  1691.   MainWindow('FillPoly demonstration');
  1692.   StatusLine('Esc aborts or press a key...');
  1693.   repeat
  1694.     Color := RandColor;
  1695.     SetFillStyle(Random(11)+1, Color);
  1696.     SetColor(Color);
  1697.     for I := 1 to MaxPts do
  1698.       with Poly[I] do
  1699.       begin
  1700.         X := Random(MaxX);
  1701.         Y := Random(MaxY);
  1702.       end;
  1703.     FillPoly(MaxPts, Poly);
  1704.   until KeyPressed;
  1705.   WaitToGo;
  1706. end; { PolyPlay }
  1707.  
  1708. procedure FillStylePlay;
  1709. { Display all of the predefined fill styles available }
  1710. var
  1711.   Style    : word;
  1712.   Width    : word;
  1713.   Height   : word;
  1714.   X, Y     : word;
  1715.   I, J     : word;
  1716.   ViewInfo : ViewPortType;
  1717.  
  1718. procedure DrawBox(X, Y : word);
  1719. begin
  1720.   SetFillStyle(Style, MaxColor);
  1721.   with ViewInfo do
  1722.     Bar(X, Y, X+Width, Y+Height);
  1723.   Rectangle(X, Y, X+Width, Y+Height);
  1724.   OutTextXY(X+(Width div 2), Y+Height+4, Int2Str(Style));
  1725.   Inc(Style);
  1726. end; { DrawBox }
  1727.  
  1728. begin
  1729.   MainWindow('Pre-defined fill styles');
  1730.   GetViewSettings(ViewInfo);
  1731.   with ViewInfo do
  1732.   begin
  1733.     Width := 2 * ((x2+1) div 13);
  1734.     Height := 2 * ((y2-10) div 10);
  1735.   end;
  1736.   X := Width div 2;
  1737.   Y := Height div 2;
  1738.   Style := 0;
  1739.   for J := 1 to 3 do
  1740.   begin
  1741.     for I := 1 to 4 do
  1742.     begin
  1743.       DrawBox(X, Y);
  1744.       Inc(X, (Width div 2) * 3);
  1745.     end;
  1746.     X := Width div 2;
  1747.     Inc(Y, (Height div 2) * 3);
  1748.   end;
  1749.   SetTextJustify(LeftText, TopText);
  1750.   WaitToGo;
  1751. end; { FillStylePlay }
  1752.  
  1753. procedure FillPatternPlay;
  1754. { Display some user defined fill patterns }
  1755. const
  1756.   Patterns : array[0..11] of FillPatternType = (
  1757.   ($AA, $55, $AA, $55, $AA, $55, $AA, $55 üÖü üÖü  !BBäx!!!BBäx!BBäx"""DDêp""DDêp>"""BBääêp""!"BDäêêp>IÉÆ|      ° @≥î>00>><Dêx  !BBäx""DDêp&<"DDêê&22TTêêê$> $< @äêp>          ⁿBBBB<  @@Ç****DDDDDDDU¬U¬U¬U¬U¬U¬U¬▌w▌w▌w▌w▌w▌w▌w°°°≥■°°≥≥■≥≥■■°°°    ≤  ≤  ≤≤         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       ;DDD;    $"Bdÿ>@@@>||>Ac]AAA1N"A""2,  `1NA"*III*<Bü üB<<BüüüB<A" \"QIE" < <BBBB  @@    ~ ?  @ÇB$$B ""A$$"AII6 üBr»$**IIII**ccregion.  The region is defined as any pixel of
  1758.             OldColor which has a path of pixels of OldColor or NewColor
  1759.             with sides touching back to the seed point, (XSeed, YSeed).
  1760.             Therefore, only pixels of OldColor are modified and no other
  1761.             information is changed.
  1762.  
  1763.             SEE ALSO
  1764.  
  1765.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  1766.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  1767.             SETVIEW
  1768.  
  1769.             EXAMPL(HNxHHO$B<BBBB<$<BBBB<<BBBB<$BBBBBF:0BBBBF:$BBBF:B<""AAA""AAAAA"<B@@B<" <2\A">>xDDxDNDD <` <>BB= > <BBBB< BBBBF:2L\bBBBB&AaQIECA8$>""">0@@A>@@@ b$(. b$(*
  1770.     $    $    $DDDDDDD¬U¬U¬U¬U¬U¬U¬Uw▌w▌w▌w▌w▌w▌w▌°°°⌠ⁿ°°⌠⌠ⁿ⌠⌠ⁿⁿ°°°    ≈  ≈  ≈≈         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       7HH7"B\DBBRL~BB@@@@@@?R~!!~?DDDD8BBBB|@@Ç>P>III>"AA""AAA"Uw<DDDD86II6"EIQ"\ @@ "AAAAA> >     hH02L2L$$<H(,$<>>>>>>>         VMODE=VIDEOMODEGET
  1771.             IF WHICHVGA = 0 THEN STOP
  1772.             DUMMY=RES640
  1773.             SETVIEW 100, 100, 539, 379
  1774.             FILLVIEW 10
  1775.             WHILE INKEY$ = ""
  1776.             WEND
  1777.             VIDEOMODESET VMODE
  1778.             END
  1779.  
  1780.  
  1781.  
  1782.  
  1783.  
  1784.  
  1785.  
  1786.  
  1787.  
  1788.  
  1789.  
  1790.  
  1791.  
  1792.  
  1793.  
  1794.  
  1795.                                                                          63
  1796.  
  1797.  
  1798.  
  1799.  
  1800.  
  1801.           FONTGETINFO
  1802.  
  1803.             PROTOTYPE
  1804.  
  1805.             SUB FONTGETINFO (Width%, Height%)
  1806.  
  1807.             INPUT
  1808.  
  1809.             no input parameters
  1810.     WEND
  1811.             MOUSEEXIT
  1812.             VIDEOMODESET VMODE
  1813.             END
  1814.  
  1815.  
  1816.  
  1817.  
  1818.  
  1819.  
  1820.  
  1821.  
  1822.  
  1823.  
  1824.  
  1825.  
  1826.  
  1827.  
  1828.  
  1829.  
  1830.  
  1831.  
  1832.  
  1833.  
  1834.  
  1835.  
  1836.  
  1837.  
  1838.  
  1839.  
  1840.  
  1841.  
  1842.  
  1843.  
  1844.  
  1845.  
  1846.  
  1847.  
  1848.  
  1849.  
  1850.  
  1851.  
  1852.  
  1853.  
  1854.                                                                          86
  1855.  
  1856.  
  1857.  
  1858.  
  1859.  
  1860.           MOUSECURSORDEFAULT
  1861.  
  1862.             PROTOTYPE
  1863.  
  1864.             SUB MOUSECURSORDEFAULT ()
  1865.  
  1866.             INPUT
  1867.  
  1868.             no input parameters
  1869.  
  1870.             OUTPUT
  1871.  
  1872.             no value returned
  1873.  
  1874.             USAGE
  1875.  
  1876.             MOUSECURSORDEFAULT defines the mouse cursor to be a small
  1877.        ,K$╖┼╘╤░XQ)σ┤ö≡÷┴─┤àñT┘,╘¬àñX9╘⌠àñ\9╘UÜ╢≤`9╘4a╘d9╘UTa╘h9╘ta╘l9╘Uöa╘p9╘┤a╘t┘PT±x┴îÇ╖0▓ïα│ÅαU┤ôα╡ùα╢¢α╖úΓ╘pǺΓ╕¡αë ╚┴πì°sKÉφb<$⌡▌ë     φë φë I1φë  Eφë $YφÆë (mφë ,üφë 0$òφë á⌐φë ñ╜φë I¿╤φë ¼σφë ░∙φÆë 4²ë ┤!²ë ╕$5²ë ╝I²ë └]²ë ⌐8q²ë <àⁿΦiǬ∙PÖÇ ¥Ç
  1878. ⁿ░╨â@%8@ΓΦá╝╤░≡cÑÅ*$░╕≡ż≡τ╥m¿⌡ε    ╨@#µ≈$âh$âαra╨à`¥è∩Ç%Ç +─▀ TîcOî∩â°1<@  [$¿Ç¼ MMl·0ƒ Y¼─!%6a▐è ¥ì ßá+?±  P<îaTTV ╪iÇ¡≥░ `_ñ»%Çá᪠P█º»ε`éa∙É%H«┴íA%Gár∙É
  1879. iw∙Éiφ`╧≥≡╤Çmⁿ▒
  1880. ]ÆAáσw7░⌡∩    $·╟Ç√É&^`  ┐ $ⁿ  $■ $╒ nk$J-ÉQ1£PéBù »0αQ/Ñ4╜£░ºP≈Ñ4Ç⌡$(ª▀$@C]Æé≈└╕_SÇçÑ4=iÉ⌠ä╣<_np@Ñ45ò▒Y3ü¼Qí░.i>╠@5+┴╙É╛╙$@ #┴@«╦
  1881. $╤
  1882. #@Ñú4,p&e÷ü¼_ÇQºÑ4òQ  ü@;¡_áQ@e╠≥@mp!┤a╘O░√`Pñź ÇT°8ÿ!¼Åñ$½╙"q¿ PñCÇ¿α√└╥░eT"ß<p°%Pæ(╧%pδ¥/OêW0Ǽbφ φ B@[â¼8â≥µ≤(    ¿⌡%(Ç∩áTÿp+ óÜ▓0!Σ±(1±░┤ÖÇD└D0Å╡`   $ «îO@╧1
  1883. a╝╤j-0ñ│`@╖bΦaT1═⌠╝╤Σ²¼±,1öíî9lÿ28ÇÅ`Γî¿P²$,N0┴O0a╫δ≤0σú`°î╖#0δ≡└X▄1»Σî(▒¥Ç█Ñ"qá√1CÇú╟╨º Å
  1884. FT Θ²î└1ÇY0    w ²à░$@AÅ`╦Φ¼╘`▄1A  }┐Ç*5 ΩSδδî`¼îaδæ¼î5 1¿⌡Ω╜⌠ ¼¥╬ü└Qî1S╛≤î9╨iÇ,∙PU(}Ç$üÇ àÇ`σìÇ`QαÜBO$%ÿÇ╧"$Ç«Ç]É.┬\`%WÉ$  W0 ÄâO0]αG┬ur╩░£▒Q¢ú╔Ç≡°s?`X0╘`@ µWâ@╣aá εdq`¥9?Ç&+o0µyÄΣAÅuV(7P╬±@IdQ╕@Å┤@;Ç▓?Çò│CÇ┤╟╨╡KÇÄ30ⁿφ° ó╬ì+]Ä╦≡     Mö╝σ ²y5<!└▀óâ╝É3~mp    $<╛≤9Æ-2ⁿ≡@T,╞Σa,)Pæ└¥#¼╪Q┤S(¼@Aîa≡╤@Ö²±⌠KëD─┴▒▀0╨Ñ$╩-0 ╨ê*╙▓edm`î=3Kß-10è=≥≤²└£mîjy ÿe²ⁿ╨i╕e▓ΣmαÖ╢C%Ç*ê*0 EátQZ`mÄLP%    °üⁿªüNQ∙  T¿<qtWΩc z░ÅÇñΩçǪçÇ«;└<┐á¼¥. á?<Σscî)áí := 0;
  1885.       end;
  1886.     end;
  1887.   end;
  1888.   WaitToGo;
  1889. end; { UserLineStylePlay }
  1890.  
  1891.  
  1892. procedure SayGoodbye;
  1893. { Say goodbye and then exit the program }
  1894. var
  1895.   ViewInfo : ViewPortType;
  1896. begin
  1897.   MainWindow('');
  1898.   GetViewSettings(ViewInfo);
  1899.   SetTextStyle(TriplexFont, HorizDir, 4);
  1900.   SetTextJustify(CenterText, CenterText);
  1901.   with ViewInfo do
  1902.     OutTextXY((x2-x1) div 2, (y2-y1) div 2, 'That''s all folks!');
  1903.   StatusLine('Press any key to quit...');
  1904.   repeat until KeyPressed;
  1905. end; { SayGoodbye }
  1906.  
  1907.  
  1908. PROCEDURE SelectMode;
  1909. VAR
  1910.     choice1,choice2     : CHAR;
  1911.    xsize,ysize            : WORD;
  1912. BEGIN
  1913.     (* Let's select a mode *)
  1914.     ClrScr;
  1915.     WriteLn('VESADEMO:');
  1916.     WriteLn('1. 256 colors');
  1917.     WriteLn('2. 32768 colors');
  1918.     WriteLn('3. 65536 colors');
  1919.     WriteLn('4. 16777216 colors');
  1920.     WriteLn('Q uit');
  1921.     WriteLn;
  1922.     Write('Your choice: ');
  1923.     REPEAT
  1924.         ReadLn(choice1);
  1925.       IF choice1 <> '1' THEN BEGIN
  1926.           WriteLn('Sorry !');
  1927.          WriteLn('This demo wasn''t written for more as 256 colors !');
  1928.          WriteLn('You would only get a limited impression of the Hi-& TrueColor modes...');
  1929.          WriteLn('Switching to 256 colors.');
  1930.          choice1 := '1';
  1931.       END;
  1932.     UNTIL choice1 IN ['1'..'4','q'];
  1933.     IF choice1 = 'q' THEN Halt;
  1934.  
  1935.     WriteLn;
  1936.     WriteLn;
  1937.     WriteLn('a. 320x200');
  1938.     WriteLn('b. 640x480');
  1939.     WriteLn('c. 800x600');
  1940.     WriteLn('d. 1024x768');
  1941.     WriteLn('e. 1280x1024');
  1942.     WriteLn('Q uit');
  1943.     WriteLn;
  1944.     Write('Your choice: ');
  1945.     REPEAT
  1946.         ReadLn(choice2);
  1947.     UNTIL choice2 IN ['a'..'e','q'];
  1948.     IF choice2 = 'q' THEN Halt;
  1949.  
  1950.     CASE choice2 OF
  1951.         'a' : BEGIN
  1952.             xsize := 320;
  1953.             ysize := 200;
  1954.         END;
  1955.         'b' : BEGIN
  1956.             xsize := 640;
  1957.             ysize := 480;
  1958.         END;
  1959.         'c' : BEGIN
  1960.             xsize := 800;
  1961.             ysize := 600;
  1962.         END;
  1963.         'd' : BEGIN
  1964.             xsize := 1024;
  1965.             ysize := 768;
  1966.         END;
  1967.         'e' : BEGIN
  1968.             xsize := 1280;
  1969.             ysize := 1024;
  1970.         END;
  1971.     END;
  1972.     CASE choice1 OF
  1973.         '1' : mode := FindVesaMode(xsize,ysize,8);
  1974.         '2' : mode := FindVesaMode(xsize,ysize,15);
  1975.         '3' : mode := FindVesaMode(xsize,ysize,16);
  1976.         '4' : mode := FindVesaMode(xsize,ysize,24);
  1977.     END;
  1978.     IF mode = 0 THEN BEGIN
  1979.         WriteLn('No such mode could be found !');
  1980.         WriteLn('Switching to to 320x200.');
  1981.         ReadKey;
  1982.         mode := V320x200x256;
  1983.     END;
  1984. END;
  1985.  
  1986. begin { program body }
  1987.   SelectMode;
  1988.   Initialize;
  1989.   ReportStatus;
  1990.  
  1991. {  AspectRatioPlay; }
  1992.   FillEllipsePlay;
  1993.   SectorPlay;
  1994.   WriteModePlay;
  1995.  
  1996.   ColorPlay;
  1997.   { PalettePlay only intended to work on these drivers: }
  1998.   if (GraphDriver = EGA) or
  1999.       (GraphDriver = EGA64) or
  2000.       (GraphDriver = VGA) then
  2001.      PalettePlay;
  2002.   PutPixelPlay;
  2003. {  PutImagePlay; }
  2004.   RandBarPlay;
  2005.   BarPlay;
  2006.   Bar3DPlay;
  2007.   ArcPlay;
  2008.   CirclePlay;
  2009.   PiePlay;
  2010.   LineToPlay;
  2011.   LineRelPlay;
  2012. {  LineStylePlay; }
  2013. {  UserLineStylePlay; }
  2014.   TextDump;
  2015.   TextPlay;
  2016.   CrtModePlay;
  2017.   FillStylePlay;
  2018.   FillPatternPlay;
  2019.   PolyPlay;
  2020.   SayGoodbye;
  2021. {  CloseGraph; }
  2022.   CloseVesa;
  2023. end.
  2024. ***************************************************
  2025.     '* SHOW D2ROTATE (ABOUT THE ORIGIN)
  2026.     '****************************************************************∞╥≤c≤*φè#^│v/╒:j═φ0t+l▓ô"¬"g└≡?%ªêΣ│H╫½╫╜├¿U'╒⌐⌡ ßV?╩¬ujOΦçEZ1∞▐! ▄B╛Σ8║æ]1GlNÜ┐q▌▓;ô$ΦzE<cª*bEô#ä╧ñÅ"∩─LrdaÖ ╠º╫a^¥£å╬1~)@ëÖMδ╫0═6DäFê¬Çv┼ß╨kæpτ╪É)}ª 1w3╤╧ü⌡¥╓h▓╣≈ïÅaÑ[TⁿHqªÉ╝DKÄ─Y-∞tT╤Θ╨º╟╪.*ÇI9lΦ≈{πτcσ$τπßoFr╪╨∩┼╞╟;O2■e²LÜ4^N|╪½ÅO?╔°FOz`╟╟╟'<>>π$πΘù6·Xgî╖│°oîδπGƒd╝▀░?■╪╔_9L ⌡ôⁿq'æO▀ƒn4╔▀╚▄┼3pτ.òO°·}÷╕ⁿ±'æO?ít│!√8ßÑ≤/┐╣p┼≥┘E╦Vox╕cΦé5╟╚º╙$?√$≥ΘZεsî≡åìΓpKù¢ïß X╥ 9╞≈\µk┤O¥_ 5Üö\≤éÄ┌╤A[╤ÿáï┼éNⁿÅu16    g,%hc╙╨cD╨Vï┘R¢öKñR;8εáΣ╢╪ós╤π╡á└èxgzPÄMú╫yαºÉ+σJ¢i+▓â3╥    ═Ñ╙î^ºG▓█πérφçs %#(╗⌠?┼%u8≡6+QÉ))ò)Afw≈╣╪)B&4░åLXV:δät@Å.;5Φf╢Ät┐ΣJ╫─U8úÇ╟éö£╕p╔┴⌠vg╨╬╥é÷╪╣┬ΓI.ç≡^v╤ZΦÇ& ╒┌6ñô6XßNè╡╬E₧Ñ
  2027. kIº╠▄A+╣╥éb²tæ-Y¡½αÑa═uuîÇ╢αêvhuª╡SÅ┤vèùú¥F;p<d⌐/F─d█éT%▓KΦû=q■öI┐ ┐╠6S$▒÷╚ENΩ¥Fû9╔┌R'╝ ╧φ└?g┬j▓0═/b╖₧─mûé╢┌»ÿÄë/·<éò■░╤╟╢├Xσ:╥P3Θ"╬Læsφ░┌öSö!╗¿*mN£WΣÇ£┤~#╗ææ≥RΩóh:à▌.æ≈╕▌v£äàd▒à╒├=░╖π║$howeg*╬    6ù▄ƒô╕φ░Ö╢qΘD>(w@úKεHÆ╛öúΣU
  2028. éÜR╔╤W▄èê 2M%ó.▓SNÖA1ùJE╢║l]▓¿>\%└Å4ßO▄£â⌐& ê/)8vSP▀▓ôⁿææ√ü√ÑÄa⌠â╚4S╓╟P- ?Σá╕▓Næ*q╡UΘ▓≈^ñ·I.rúR&$Y^╚%è≡B┌≈Ceat
  2029.     Color := RandColor;
  2030.     SetColor(Color);
  2031.     SetFillStyle(Random(CloseDotFill)+1, Color);
  2032.     Bar3D(Random(MaxWidth), Random(MaxHeight),
  2033.           Random(MaxWidth), Random(MaxHeight), 0, TopOff);
  2034.   until KeyPressed;
  2035.   WaitToGo;
  2036. end; { RandBarPlay }
  2037.  
  2038. procedure ArcPlay;
  2039. { Draw random arcs on the screen }
  2040. var
  2041.   MaxRadius : word;
  2042.   EndAngle : word;
  2043.   ArcInfo : ArcCoordsType;
  2044. begin
  2045.   MainWindow('Arc / GetArcCoords demonstration');
  2046.   StatusLine('Esc aborts or press a key');
  2047.   MaxRadius := MaxY div 10;
  2048.   repeat
  2049.     SetColor(RandColor);
  2050.     EndAngle := Random(360);
  2051.     SetLineStyle(SolidLn, 0, NormWidth);
  2052.     Arc(Random(MaxX), Random(MaxY), Random(EndAngle), EndAngle, Random(MaxRadius));
  2053.     GetArcCoords(ArcInfo);
  2054.     with ArcInfo do
  2055.     begin
  2056.       Line(X, Y, XStart, YStart);
  2057.       Line(X, Y, Xend, Yend);
  2058.     end;
  2059.   until KeyPressed;
  2060.   WaitToGo;
  2061. end; { ArcPlay }
  2062.  
  2063. procedure PutPixelPlay;
  2064. { Demonstrate the PutPixel and GetPixel commands }
  2065. const
  2066.   Seed   = 1962; { A seed for the random number generator }
  2067.   NumPts = 2000; { The number of pixels plotted }
  2068.   Esc    = #27;
  2069. var
  2070.   I : word;
  2071.   X, Y, Color : word;
  2072.   XMax, YMax  : integer;
  2073.   ViewInfo    : ViewPortType;
  2074. begin
  2075.   MainWindow('PutPixel / GetPixel demonstration');
  2076.   StatusLine('Esc aborts or press a key...');
  2077.  
  2078.   GetViewSettings(ViewInfo);
  2079.   with ViewInfo do
  2080.   begin
  2081.     XMax := (x2-x1-1);
  2082.     YMax := (y2-y1-1);
  2083.   end;
  2084.  
  2085.   while not KeyPressed do
  2086.   begin
  2087.     { Plot random pixels }
  2088.     RandSeed := Seed;
  2089.     I := 0;
  2090.     while (not KeyPressed) and (I < NumPts) do
  2091.     begin
  2092.       Inc(I);
  2093.         PutPixel(Random(XMax)+1, Random(YMax)+1, RandColor);
  2094.     end;
  2095.  
  2096.     { Erase pixels }
  2097.     RandSeed := Seed;
  2098.     I := 0;
  2099.     while (not KeyPressed) and (I < NumPts) do
  2100.     begin
  2101.       Inc(I);
  2102.       X := Random(XMax)+1;
  2103.       Y := Random(YMax)+1;
  2104.       Color := GetPixel(X, Y);
  2105.         if Color = RandColor then
  2106.           PutPixel(X, Y, 0);
  2107.      end;
  2108.   end;
  2109.   WaitToGo;
  2110. end; { PutPixelPlay }
  2111.  
  2112. procedure PutImagePlay;
  2113. { Demonstrate the GetImage and PutImage commands }
  2114.  
  2115. const
  2116.   r  = 20;
  2117.   StartX = 100;
  2118.   StartY = 50;
  2119.  
  2120. var
  2121.   CurPort : ViewPortType;
  2122.  
  2123. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  2124. var
  2125.   Step : integer;
  2126. begin
  2127.   Step := Random(2*r);
  2128.   if Odd(Step) then
  2129.     Step := -Step;
  2130.   X := X + Step;
  2131.   Step := Random(r);
  2132.   if Odd(Step) then
  2133.     Step := -Step;
  2134.   Y := Y + Step;
  2135.  
  2136.   { Make saucer bounce off viewport walls }
  2137.   with CurPort do
  2138.   begin
  2139.     if (x1 + X + Width - 1 > x2) then
  2140.       X := x2-x1 - Width + 1
  2141.     else
  2142.       if (X < 0) then
  2143.         X := 0;
  2144.     if (y1 + Y + Height - 1 > y2) then
  2145.       Y := y2-y1 - Height + 1
  2146.     else
  2147.       if (Y < 0) then
  2148.         Y := 0;
  2149.   end;
  2150. end; { MoveSaucer }
  2151.  
  2152. var
  2153.   Pausetime : word;
  2154.   Saucer    : pointer;
  2155.   X, Y      : integer;
  2156.   ulx, uly  : word;
  2157.   lrx, lry  : word;
  2158.   Size      : word;
  2159.   I         : word;
  2160. begin
  2161.   ClearDevice;
  2162.   FullPort;
  2163.  
  2164.   { PaintScreen }
  2165.   ClearDevice;
  2166.   MainWindow('GetImage / PutImage Demonstration');
  2167.   StatusLine('Esc aborts or press a key...');
  2168.   GetViewSettings(CurPort);
  2169.  
  2170.   { DrawSaucer }
  2171.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  2172.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  2173.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  2174.   Circle(StartX+10, StartY-12, 2);
  2175.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  2176.   Circle(StartX-10, StartY-12, 2);
  2177.   SetFillStyle(SolidFill, MaxColor);
  2178.   FloodFill(StartX+1, StartY+4, GetColor);
  2179.  
  2180.   { ReadSaucerImage }
  2181.   ulx := StartX-(r+1);
  2182.   uly := StartY-14;
  2183.   lrx := StartX+(r+1);
  2184.   lry := StartY+(r div 3)+3;
  2185.  
  2186.   Size := ImageSize(ulx, uly, lrx, lry);
  2187.   GetMem(Saucer, Size);
  2188.   GetImage(ulx, uly, lrx, lry, Saucer^);
  2189. {  PutImage(ulx, uly, Saucer^, XORput);               { erase image }
  2190.  
  2191.   { Plot some "stars" }
  2192.   for I := 1 to 1000 do
  2193.      PutPixel(Random(MaxX), Random(MaxY), RandColor);
  2194.   X := MaxX div 2;
  2195.   Y := MaxY div 2;
  2196.   PauseTime := 70;
  2197.  
  2198.   { Move the saucer around }
  2199.   repeat
  2200. {     PutImage(X, Y, Saucer^, XORput);                 { draw image }
  2201.      Delay(PauseTime);
  2202. {     PutImage(X, Y, Saucer^, XORput);                 { erase image }
  2203.      MoveSaucer(X, Y, lrx - ulx + 1, lry - uly + 1);  { width/height }
  2204.   until KeyPressed;
  2205.   FreeMem(Saucer, size);
  2206.   WaitToGo;
  2207. end; { PutImagePlay }
  2208.  
  2209. procedure PolyPlay;
  2210. { Draw random polygons with random fill styles on the screen }
  2211. const
  2212.   MaxPts = 5;
  2213. type
  2214.   PolygonType = array[1..MaxPts] of PointType;
  2215. var
  2216.   Poly : PolygonType;
  2217.   I, Color : word;
  2218. begin
  2219.   MainWindow('FillPoly demonstration');
  2220.   StatusLine('Esc aborts or press a key...');
  2221.   repeat
  2222.     Color := RandColor;
  2223.     SetFillStyle(Random(11)+1, Color);
  2224.     SetColor(Color);
  2225.     for I := 1 to MaxPts do
  2226.       with Poly[I] do
  2227.       begin
  2228.         X := Random(MaxX);
  2229.         Y := Random(MaxY);
  2230.       end;
  2231.     FillPoly(MaxPts, Poly);
  2232.   until KeyPressed;
  2233.   WaitToGo;
  2234. end; { PolyPlay }
  2235.  
  2236. procedure FillStylePlay;
  2237. { Display all of the predefined fill styles available }
  2238. var
  2239.   Style    : word;
  2240.   Width    : word;
  2241.   Height   : word;
  2242.   X, Y     : word;
  2243.   I, J     : word;
  2244.   ViewInfo : ViewPortType;
  2245.  
  2246. procedure DrawBox(X, Y : word);
  2247. begin
  2248.   SetFillStyle(Style, MaxColor);
  2249.   with ViewInfo do
  2250.     Bar(X, Y, X+Width, Y+Height);
  2251.   Rectangle(X, Y, X+Width, Y+Height);
  2252.   OutTextXY(X+(Width div 2), Y+Height+4, Int2Str(Style));
  2253.   Inc(Style);
  2254. end; { DrawBox }
  2255.  
  2256. begin
  2257.   MainWindow('Pre-defined fill styles');
  2258.   GetViewSettings(ViewInfo);
  2259.   with ViewInfo do
  2260.   begin
  2261.     Width := 2 * ((x2+1) div 13);
  2262.     Height := 2 * ((y2-10) div 10);
  2263.   end;
  2264.   X := Width div 2;
  2265.   Y := Height div 2;
  2266.   Style := 0;
  2267.   for J := 1 to 3 do
  2268.   begin
  2269.     for I := 1 to 4 do
  2270.     begin
  2271.       DrawBox(X, Y);
  2272.       Inc(X, (Width div 2) * 3);
  2273.     end;
  2274.     X := Width div 2;
  2275.     Inc(Y, (Height div 2) * 3);
  2276.   end;
  2277.   SetTextJustify(LeftText, TopText);
  2278.   WaitToGo;
  2279. end; { FillStylePlay }
  2280.  
  2281. procedure FillPatternPlay;
  2282. { Display some user defined fill patterns }
  2283. const
  2284.   Patterns : array[0..11] of FillPatternType = (
  2285.   ($AA, $55, $AA, $55, $AA, $55, $AA, $55 üÖü üÖü  !BBäx!!!BBäx!BBäx"""DDêp""DDêp>"""BBääêp""!"BDäêêp>IÉÆ|      ° @≥î>00>><Dêx  !BBäx""DDêp&<"DDêê&22TTêêê$> $< @äêp>          ⁿBBBB<  @@Ç****DDDDDDDU¬U¬U¬U¬U¬U¬U¬▌w▌w▌w▌w▌w▌w▌w°°°≥■°°≥≥■≥≥■■°°°    ≤  ≤  ≤≤         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       ;DDD;    $"Bdÿ>@@@>||>Ac]AAA1N"A""2,  `1NA"*III*<Bü üB<<BüüüB<A" \"QIE" < <BBBB  @@    ~ ?  @ÇB$$B ""A$$"AII6 üBr»$**IIII**ccregion.  The region is defined as any pixel of
  2286.             OldColor which has a path of pixels of OldColor or NewColor
  2287.             with sides touching back to the seed point, (XSeed, YSeed).
  2288.             Therefore, only pixels of OldColor are modified and no other
  2289.             information is changed.
  2290.  
  2291.             SEE ALSO
  2292.  
  2293.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  2294.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  2295.             SETVIEW
  2296.  
  2297.             EXAMPL(HNxHHO$B<BBBB<$<BBBB<<BBBB<$BBBBBF:0BBBBF:$BBBF:B<""AAA""AAAAA"<B@@B<" <2\A">>xDDxDNDD <` <>BB= > <BBBB< BBBBF:2L\bBBBB&AaQIECA8$>""">0@@A>@@@ b$(. b$(*
  2298.     $    $    $DDDDDDD¬U¬U¬U¬U¬U¬U¬Uw▌w▌w▌w▌w▌w▌w▌°°°⌠ⁿ°°⌠⌠ⁿ⌠⌠ⁿⁿ°°°    ≈  ≈  ≈≈         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       7HH7"B\DBBRL~BB@@@@@@?R~!!~?DDDD8BBBB|@@Ç>P>III>"AA""AAA"Uw<DDDD86II6"EIQ"\ @@ "AAAAA> >     hH02L2L$$<H(,$<>>>>>>>         VMODE=VIDEOMODEGET
  2299.             IF WHICHVGA = 0 THEN STOP
  2300.             DUMMY=RES640
  2301.             SETVIEW 100, 100, 539, 379
  2302.             FILLVIEW 10
  2303.             WHILE INKEY$ = ""
  2304.             WEND
  2305.             VIDEOMODESET VMODE
  2306.             END
  2307.  
  2308.  
  2309.  
  2310.  
  2311.  
  2312.  
  2313.  
  2314.  
  2315.  
  2316.  
  2317.  
  2318.  
  2319.  
  2320.  
  2321.  
  2322.  
  2323.                                                                          63
  2324.  
  2325.  
  2326.  
  2327.  
  2328.  
  2329.           FONTGETINFO
  2330.  
  2331.             PROTOTYPE
  2332.  
  2333.             SUB FONTGETINFO (Width%, Height%)
  2334.  
  2335.             INPUT
  2336.  
  2337.             no input parameters
  2338.     WEND
  2339.             MOUSEEXIT
  2340.             VIDEOMODESET VMODE
  2341.             END
  2342.  
  2343.  
  2344.  
  2345.  
  2346.  
  2347.  
  2348.  
  2349.  
  2350.  
  2351.  
  2352.  
  2353.  
  2354.  
  2355.  
  2356.  
  2357.  
  2358.  
  2359.  
  2360.  
  2361.  
  2362.  
  2363.  
  2364.  
  2365.  
  2366.  
  2367.  
  2368.  
  2369.  
  2370.  
  2371.  
  2372.  
  2373.  
  2374.  
  2375.  
  2376.  
  2377.  
  2378.  
  2379.  
  2380.  
  2381.  
  2382.                                                                          86
  2383.  
  2384.  
  2385.  
  2386.  
  2387.  
  2388.           MOUSECURSORDEFAULT
  2389.  
  2390.             PROTOTYPE
  2391.  
  2392.             SUB MOUSECURSORDEFAULT ()
  2393.  
  2394.             INPUT
  2395.  
  2396.             no input parameters
  2397.  
  2398.             OUTPUT
  2399.  
  2400.             no value returned
  2401.  
  2402.             USAGE
  2403.  
  2404.             MOUSECURSORDEFAULT defines the mouse cursor to be a small
  2405.        ,K$╖┼╘╤░XQ)σ┤ö≡÷┴─┤àñT┘,╘¬àñX9╘⌠àñ\9╘UÜ╢≤`9╘4a╘d9╘UTa╘h9╘ta╘l9╘Uöa╘p9╘┤a╘t┘PT±x┴îÇ╖0▓ïα│ÅαU┤ôα╡ùα╢¢α╖úΓ╘pǺΓ╕¡αë ╚┴πì°sKÉφb<$⌡▌ë     φë φë I1φë  Eφë $YφÆë (mφë ,üφë 0$òφë á⌐φë ñ╜φë I¿╤φë ¼σφë ░∙φÆë 4²ë ┤!²ë ╕$5²ë ╝I²ë └]²ë ⌐8q²ë <àⁿΦiǬ∙PÖÇ ¥Ç
  2406. ⁿ░╨â@%8@ΓΦá╝╤░≡cÑÅ*$░╕≡ż≡τ╥m¿⌡ε    ╨@#µ≈$âh$âαra╨à`¥è∩Ç%Ç +─▀ TîcOî∩â°1<@  [$¿Ç¼ MMl·0ƒ Y¼─!%6a▐è ¥ì ßá+?±  P<îaTTV ╪iÇ¡≥░ `_ñ»%Çá᪠P█º»ε`éa∙É%H«┴íA%Gár∙É
  2407. iw∙Éiφ`╧≥≡╤Çmⁿ▒
  2408. ]ÆAáσw7░⌡∩    $·╟Ç√É&^`  ┐ $ⁿ  $■ $╒ nk$J-ÉQ1£PéBù »0αQ/Ñ4╜£░ºP≈Ñ4Ç⌡$(ª▀$@C]Æé≈└╕_SÇçÑ4=iÉ⌠ä╣<_np@Ñ45ò▒Y3ü¼Qí░.i>╠@5+┴╙É╛╙$@ #┴@«╦
  2409. $╤
  2410. #@Ñú4,p&e÷ü¼_ÇQºÑ4òQ  ü@;¡_áQ@e╠≥@mp!┤a╘O░√`Pñź ÇT°8ÿ!¼Åñ$½╙"q¿ PñCÇ¿α√└╥░eT"ß<p°%Pæ(╧%pδ¥/OêW0Ǽbφ φ B@[â¼8â≥µ≤(    ¿⌡%(Ç∩áTÿp+ óÜ▓0!Σ±(1±░┤ÖÇD└D0Å╡`   $ «îO@╧1
  2411. a╝╤j-0ñ│`@╖bΦaT1═⌠╝╤Σ²¼±,1öíî9lÿ28ÇÅ`Γî¿P²$,N0┴O0a╫δ≤0σú`°î╖#0δ≡└X▄1»Σî(▒¥Ç█Ñ"qá√1CÇú╟╨º Å
  2412. FT Θ²î└1ÇY0    w ²à░$@AÅ`╦Φ¼╘`▄1A  }┐Ç*5 ΩSδδî`¼îaδæ¼î5 1¿⌡Ω╜⌠ ¼¥╬ü└Qî1S╛≤î9╨iÇ,∙PU(}Ç$üÇ àÇ`σìÇ`QαÜBO$%ÿÇ╧"$Ç«Ç]É.┬\`%WÉ$  W0 ÄâO0]αG┬ur╩░£▒Q¢ú╔Ç≡°s?`X0╘`@ µWâ@╣aá εdq`¥9?Ç&+o0µyÄΣAÅuV(7P╬±@IdQ╕@Å┤@;Ç▓?Çò│CÇ┤╟╨╡KÇÄ30ⁿφ° ó╬ì+]Ä╦≡     Mö╝σ ²y5<!└▀óâ╝É3~mp    $<╛≤9Æ-2ⁿ≡@T,╞Σa,)Pæ└¥#¼╪Q┤S(¼@Aîa≡╤@Ö²±⌠KëD─┴▒▀0╨Ñ$╩-0 ╨ê*╙▓edm`î=3Kß-10è=≥≤²└£mîjy ÿe²ⁿ╨i╕e▓ΣmαÖ╢C%Ç*ê*0 EátQZ`mÄLP%    °üⁿªüNQ∙  T¿<qtWΩc z░ÅÇñΩçǪçÇ«;└<┐á¼¥. á?<Σscî)áí := 0;
  2413.       end;
  2414.     end;
  2415.   end;
  2416.   WaitToGo;
  2417. end; { UserLineStylePlay }
  2418.  
  2419.  
  2420. procedure SayGoodbye;
  2421. { Say goodbye and then exit the program }
  2422. var
  2423.   ViewInfo : ViewPortType;
  2424. begin
  2425.   MainWindow('');
  2426.   GetViewSettings(ViewInfo);
  2427.   SetTextStyle(TriplexFont, HorizDir, 4);
  2428.   SetTextJustify(CenterText, CenterText);
  2429.   with ViewInfo do
  2430.     OutTextXY((x2-x1) div 2, (y2-y1) div 2, 'That''s all folks!');
  2431.   StatusLine('Press any key to quit...');
  2432.   repeat until KeyPressed;
  2433. end; { SayGoodbye }
  2434.  
  2435.  
  2436. PROCEDURE SelectMode;
  2437. VAR
  2438.     choice1,choice2     : CHAR;
  2439.    xsize,ysize            : WORD;
  2440. BEGIN
  2441.     (* Let's select a mode *)
  2442.     ClrScr;
  2443.     WriteLn('VESADEMO:');
  2444.     WriteLn('1. 256 colors');
  2445.     WriteLn('2. 32768 colors');
  2446.     WriteLn('3. 65536 colors');
  2447.     WriteLn('4. 16777216 colors');
  2448.     WriteLn('Q uit');
  2449.     WriteLn;
  2450.     Write('Your choice: ');
  2451.     REPEAT
  2452.         ReadLn(choice1);
  2453.       IF choice1 <> '1' THEN BEGIN
  2454.           WriteLn('Sorry !');
  2455.          WriteLn('This demo wasn''t written for more as 256 colors !');
  2456.          WriteLn('You would only get a limited impression of the Hi-& TrueColor modes...');
  2457.          WriteLn('Switching to 256 colors.');
  2458.          choice1 := '1';
  2459.       END;
  2460.     UNTIL choice1 IN ['1'..'4','q'];
  2461.     IF choice1 = 'q' THEN Halt;
  2462.  
  2463.     WriteLn;
  2464.     WriteLn;
  2465.     WriteLn('a. 320x200');
  2466.     WriteLn('b. 640x480');
  2467.     WriteLn('c. 800x600');
  2468.     WriteLn('d. 1024x768');
  2469.     WriteLn('e. 1280x1024');
  2470.     WriteLn('Q uit');
  2471.     WriteLn;
  2472.     Write('Your choice: ');
  2473.     REPEAT
  2474.         ReadLn(choice2);
  2475.     UNTIL choice2 IN ['a'..'e','q'];
  2476.     IF choice2 = 'q' THEN Halt;
  2477.  
  2478.     CASE choice2 OF
  2479.         'a' : BEGIN
  2480.             xsize := 320;
  2481.             ysize := 200;
  2482.         END;
  2483.         'b' : BEGIN
  2484.             xsize := 640;
  2485.             ysize := 480;
  2486.         END;
  2487.         'c' : BEGIN
  2488.             xsize := 800;
  2489.             ysize := 600;
  2490.         END;
  2491.         'd' : BEGIN
  2492.             xsize := 1024;
  2493.             ysize := 768;
  2494.         END;
  2495.         'e' : BEGIN
  2496.             xsize := 1280;
  2497.             ysize := 1024;
  2498.         END;
  2499.     END;
  2500.     CASE choice1 OF
  2501.         '1' : mode := FindVesaMode(xsize,ysize,8);
  2502.         '2' : mode := FindVesaMode(xsize,ysize,15);
  2503.         '3' : mode := FindVesaMode(xsize,ysize,16);
  2504.         '4' : mode := FindVesaMode(xsize,ysize,24);
  2505.     END;
  2506.     IF mode = 0 THEN BEGIN
  2507.         WriteLn('No such mode could be found !');
  2508.         WriteLn('Switching to to 320x200.');
  2509.         ReadKey;
  2510.         mode := V320x200x256;
  2511.     END;
  2512. END;
  2513.  
  2514. begin { program body }
  2515.   SelectMode;
  2516.   Initialize;
  2517.   ReportStatus;
  2518.  
  2519. {  AspectRatioPlay; }
  2520.   FillEllipsePlay;
  2521.   SectorPlay;
  2522.   WriteModePlay;
  2523.  
  2524.   ColorPlay;
  2525.   { PalettePlay only intended to work on these drivers: }
  2526.   if (GraphDriver = EGA) or
  2527.       (GraphDriver = EGA64) or
  2528.       (GraphDriver = VGA) then
  2529.      PalettePlay;
  2530.   PutPixelPlay;
  2531. {  PutImagePlay; }
  2532.   RandBarPlay;
  2533.   BarPlay;
  2534.   Bar3DPlay;
  2535.   ArcPlay;
  2536.   CirclePlay;
  2537.   PiePlay;
  2538.   LineToPlay;
  2539.   LineRelPlay;
  2540. {  LineStylePlay; }
  2541. {  UserLineStylePlay; }
  2542.   TextDump;
  2543.   TextPlay;
  2544.   CrtModePlay;
  2545.   FillStylePlay;
  2546.   FillPatternPlay;
  2547.   PolyPlay;
  2548.   SayGoodbye;
  2549. {  CloseGraph; }
  2550.   CloseVesa;
  2551. end.
  2552. ***************************************************
  2553.     '* SHOW D2ROTATE (ABOUT THE ORIGIN)
  2554.     '****************************************************************∞╥≤c≤*φè#^│v/╒:j═φ0t+l▓ô"¬"g└≡?%ªêΣ│H╫½╫╜├¿U'╒⌐⌡ ßV?╩¬ujOΦçEZ1∞▐! ▄B╛Σ8║æ]1GlNÜ┐q▌▓;ô$ΦzE<cª*bEô#ä╧ñÅ"∩─LrdaÖ ╠º╫a^¥£å╬1~)@ëÖMδ╫0═6DäFê¬Çv┼ß╨kæpτ╪É)}ª 1w3╤╧ü⌡¥╓h▓╣≈ïÅaÑ[TⁿHqªÉ╝DKÄ─Y-∞tT╤Θ╨º╟╪.*ÇI9lΦ≈{πτcσ$τπßoFr╪╨∩┼╞╟;O2■e²LÜ4^N|╪½ÅO?╔°FOz`╟╟╟'<>>π$πΘù6·Xgî╖│°oîδπGƒd╝▀░?■╪╔_9L ⌡ôⁿq'æO▀ƒn4╔▀╚▄┼3pτ.òO°·}÷╕ⁿ±'æO?ít│!√8ßÑ≤/┐╣p┼≥┘E╦Vox╕cΦé5╟╚º╙$?√$≥ΘZεsî≡åìΓpKù¢ïß X╥ 9╞≈\µk┤O¥_ 5Üö\≤éÄ┌╤A[╤ÿáï┼éNⁿÅu16    g,%hc╙╨cD╨Vï┘R¢öKñR;8εáΣ╢╪ós╤π╡á└èxgzPÄMú╫yαºÉ+σJ¢i+▓â3╥    ═Ñ╙î^ºG▓█πérφçs %#(╗⌠?┼%u8≡6+QÉ))ò)Afw≈╣╪)B&4░åLXV:δät@Å.;5Φf╢Ät┐ΣJ╫─U8úÇ╟éö£╕p╔┴⌠vg╨╬╥é÷╪╣┬ΓI.ç≡^v╤ZΦÇ& ╒┌6ñô6XßNè╡╬E₧Ñ
  2555. kIº╠▄A+╣╥éb²tæ-Y¡½αÑa═uuîÇ╢αêvhuª╡SÅ┤vèùú¥F;p<d⌐/F─d█éT%▓KΦû=q■öI┐ ┐╠6S$▒÷╚ENΩ¥Fû9╔┌R'╝ ╧φ└?g┬j▓0═/b╖₧─mûé╢┌»ÿÄë/·<éò■░╤╟╢├Xσ:╥P3Θ"╬Læsφ░┌öSö!╗¿*mN£WΣÇ£┤~#╗ææ≥RΩóh:à▌.æ≈╕▌v£äàd▒à╒├=░╖π║$howeg*╬    6ù▄ƒô╕φ░Ö╢qΘD>(w@úKεHÆ╛öúΣU
  2556. éÜR╔╤W▄èê 2M%ó.▓SNÖA1ùJE╢║l]▓¿>\%└Å4ßO▄£â⌐& ê/)8vSP▀▓ôⁿææ√ü√ÑÄa⌠â╚4S╓╟P- ?Σá╕▓Næ*q╡UΘ▓≈^ñ·I.rúR&$Y^╚%è≡B┌≈Ceat
  2557.     Color := RandColor;
  2558.     SetColor(Color);
  2559.     SetFillStyle(Random(CloseDotFill)+1, Color);
  2560.     Bar3D(Random(MaxWidth), Random(MaxHeight),
  2561.           Random(MaxWidth), Random(MaxHeight), 0, TopOff);
  2562.   until KeyPressed;
  2563.   WaitToGo;
  2564. end; { RandBarPlay }
  2565.  
  2566. procedure ArcPlay;
  2567. { Draw random arcs on the screen }
  2568. var
  2569.   MaxRadius : word;
  2570.   EndAngle : word;
  2571.   ArcInfo : ArcCoordsType;
  2572. begin
  2573.   MainWindow('Arc / GetArcCoords demonstration');
  2574.   StatusLine('Esc aborts or press a key');
  2575.   MaxRadius := MaxY div 10;
  2576.   repeat
  2577.     SetColor(RandColor);
  2578.     EndAngle := Random(360);
  2579.     SetLineStyle(SolidLn, 0, NormWidth);
  2580.     Arc(Random(MaxX), Random(MaxY), Random(EndAngle), EndAngle, Random(MaxRadius));
  2581.     GetArcCoords(ArcInfo);
  2582.     with ArcInfo do
  2583.     begin
  2584.       Line(X, Y, XStart, YStart);
  2585.       Line(X, Y, Xend, Yend);
  2586.     end;
  2587.   until KeyPressed;
  2588.   WaitToGo;
  2589. end; { ArcPlay }
  2590.  
  2591. procedure PutPixelPlay;
  2592. { Demonstrate the PutPixel and GetPixel commands }
  2593. const
  2594.   Seed   = 1962; { A seed for the random number generator }
  2595.   NumPts = 2000; { The number of pixels plotted }
  2596.   Esc    = #27;
  2597. var
  2598.   I : word;
  2599.   X, Y, Color : word;
  2600.   XMax, YMax  : integer;
  2601.   ViewInfo    : ViewPortType;
  2602. begin
  2603.   MainWindow('PutPixel / GetPixel demonstration');
  2604.   StatusLine('Esc aborts or press a key...');
  2605.  
  2606.   GetViewSettings(ViewInfo);
  2607.   with ViewInfo do
  2608.   begin
  2609.     XMax := (x2-x1-1);
  2610.     YMax := (y2-y1-1);
  2611.   end;
  2612.  
  2613.   while not KeyPressed do
  2614.   begin
  2615.     { Plot random pixels }
  2616.     RandSeed := Seed;
  2617.     I := 0;
  2618.     while (not KeyPressed) and (I < NumPts) do
  2619.     begin
  2620.       Inc(I);
  2621.         PutPixel(Random(XMax)+1, Random(YMax)+1, RandColor);
  2622.     end;
  2623.  
  2624.     { Erase pixels }
  2625.     RandSeed := Seed;
  2626.     I := 0;
  2627.     while (not KeyPressed) and (I < NumPts) do
  2628.     begin
  2629.       Inc(I);
  2630.       X := Random(XMax)+1;
  2631.       Y := Random(YMax)+1;
  2632.       Color := GetPixel(X, Y);
  2633.         if Color = RandColor then
  2634.           PutPixel(X, Y, 0);
  2635.      end;
  2636.   end;
  2637.   WaitToGo;
  2638. end; { PutPixelPlay }
  2639.  
  2640. procedure PutImagePlay;
  2641. { Demonstrate the GetImage and PutImage commands }
  2642.  
  2643. const
  2644.   r  = 20;
  2645.   StartX = 100;
  2646.   StartY = 50;
  2647.  
  2648. var
  2649.   CurPort : ViewPortType;
  2650.  
  2651. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  2652. var
  2653.   Step : integer;
  2654. begin
  2655.   Step := Random(2*r);
  2656.   if Odd(Step) then
  2657.     Step := -Step;
  2658.   X := X + Step;
  2659.   Step := Random(r);
  2660.   if Odd(Step) then
  2661.     Step := -Step;
  2662.   Y := Y + Step;
  2663.  
  2664.   { Make saucer bounce off viewport walls }
  2665.   with CurPort do
  2666.   begin
  2667.     if (x1 + X + Width - 1 > x2) then
  2668.       X := x2-x1 - Width + 1
  2669.     else
  2670.       if (X < 0) then
  2671.         X := 0;
  2672.     if (y1 + Y + Height - 1 > y2) then
  2673.       Y := y2-y1 - Height + 1
  2674.     else
  2675.       if (Y < 0) then
  2676.         Y := 0;
  2677.   end;
  2678. end; { MoveSaucer }
  2679.  
  2680. var
  2681.   Pausetime : word;
  2682.   Saucer    : pointer;
  2683.   X, Y      : integer;
  2684.   ulx, uly  : word;
  2685.   lrx, lry  : word;
  2686.   Size      : word;
  2687.   I         : word;
  2688. begin
  2689.   ClearDevice;
  2690.   FullPort;
  2691.  
  2692.   { PaintScreen }
  2693.   ClearDevice;
  2694.   MainWindow('GetImage / PutImage Demonstration');
  2695.   StatusLine('Esc aborts or press a key...');
  2696.   GetViewSettings(CurPort);
  2697.  
  2698.   { DrawSaucer }
  2699.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  2700.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  2701.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  2702.   Circle(StartX+10, StartY-12, 2);
  2703.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  2704.   Circle(StartX-10, StartY-12, 2);
  2705.   SetFillStyle(SolidFill, MaxColor);
  2706.   FloodFill(StartX+1, StartY+4, GetColor);
  2707.  
  2708.   { ReadSaucerImage }
  2709.   ulx := StartX-(r+1);
  2710.   uly := StartY-14;
  2711.   lrx := StartX+(r+1);
  2712.   lry := StartY+(r div 3)+3;
  2713.  
  2714.   Size := ImageSize(ulx, uly, lrx, lry);
  2715.   GetMem(Saucer, Size);
  2716.   GetImage(ulx, uly, lrx, lry, Saucer^);
  2717. {  PutImage(ulx, uly, Saucer^, XORput);               { erase image }
  2718.  
  2719.   { Plot some "stars" }
  2720.   for I := 1 to 1000 do
  2721.      PutPixel(Random(MaxX), Random(MaxY), RandColor);
  2722.   X := MaxX div 2;
  2723.   Y := MaxY div 2;
  2724.   PauseTime := 70;
  2725.  
  2726.   { Move the saucer around }
  2727.   repeat
  2728. {     PutImage(X, Y, Saucer^, XORput);                 { draw image }
  2729.      Delay(PauseTime);
  2730. {     PutImage(X, Y, Saucer^, XORput);                 { erase image }
  2731.      MoveSaucer(X, Y, lrx - ulx + 1, lry - uly + 1);  { width/height }
  2732.   until KeyPressed;
  2733.   FreeMem(Saucer, size);
  2734.   WaitToGo;
  2735. end; { PutImagePlay }
  2736.  
  2737. procedure PolyPlay;
  2738. { Draw random polygons with random fill styles on the screen }
  2739. const
  2740.   MaxPts = 5;
  2741. type
  2742.   PolygonType = array[1..MaxPts] of PointType;
  2743. var
  2744.   Poly : PolygonType;
  2745.   I, Color : word;
  2746. begin
  2747.   MainWindow('FillPoly demonstration');
  2748.   StatusLine('Esc aborts or press a key...');
  2749.   repeat
  2750.     Color := RandColor;
  2751.     SetFillStyle(Random(11)+1, Color);
  2752.     SetColor(Color);
  2753.     for I := 1 to MaxPts do
  2754.       with Poly[I] do
  2755.       begin
  2756.         X := Random(MaxX);
  2757.         Y := Random(MaxY);
  2758.       end;
  2759.     FillPoly(MaxPts, Poly);
  2760.   until KeyPressed;
  2761.   WaitToGo;
  2762. end; { PolyPlay }
  2763.  
  2764. procedure FillStylePlay;
  2765. { Display all of the predefined fill styles available }
  2766. var
  2767.   Style    : word;
  2768.   Width    : word;
  2769.   Height   : word;
  2770.   X, Y     : word;
  2771.   I, J     : word;
  2772.   ViewInfo : ViewPortType;
  2773.  
  2774. procedure DrawBox(X, Y : word);
  2775. begin
  2776.   SetFillStyle(Style, MaxColor);
  2777.   with ViewInfo do
  2778.     Bar(X, Y, X+Width, Y+Height);
  2779.   Rectangle(X, Y, X+Width, Y+Height);
  2780.   OutTextXY(X+(Width div 2), Y+Height+4, Int2Str(Style));
  2781.   Inc(Style);
  2782. end; { DrawBox }
  2783.  
  2784. begin
  2785.   MainWindow('Pre-defined fill styles');
  2786.   GetViewSettings(ViewInfo);
  2787.   with ViewInfo do
  2788.   begin
  2789.     Width := 2 * ((x2+1) div 13);
  2790.     Height := 2 * ((y2-10) div 10);
  2791.   end;
  2792.   X := Width div 2;
  2793.   Y := Height div 2;
  2794.   Style := 0;
  2795.   for J := 1 to 3 do
  2796.   begin
  2797.     for I := 1 to 4 do
  2798.     begin
  2799.       DrawBox(X, Y);
  2800.       Inc(X, (Width div 2) * 3);
  2801.     end;
  2802.     X := Width div 2;
  2803.     Inc(Y, (Height div 2) * 3);
  2804.   end;
  2805.   SetTextJustify(LeftText, TopText);
  2806.   WaitToGo;
  2807. end; { FillStylePlay }
  2808.  
  2809. procedure FillPatternPlay;
  2810. { Display some user defined fill patterns }
  2811. const
  2812.   Patterns : array[0..11] of FillPatternType = (
  2813.   ($AA, $55, $AA, $55, $AA, $55, $AA, $55 üÖü üÖü  !BBäx!!!BBäx!BBäx"""DDêp""DDêp>"""BBääêp""!"BDäêêp>IÉÆ|      ° @≥î>00>><Dêx  !BBäx""DDêp&<"DDêê&22TTêêê$> $< @äêp>          ⁿBBBB<  @@Ç****DDDDDDDU¬U¬U¬U¬U¬U¬U¬▌w▌w▌w▌w▌w▌w▌w°°°≥■°°≥≥■≥≥■■°°°    ≤  ≤  ≤≤         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       ;DDD;    $"Bdÿ>@@@>||>Ac]AAA1N"A""2,  `1NA"*III*<Bü üB<<BüüüB<A" \"QIE" < <BBBB  @@    ~ ?  @ÇB$$B ""A$$"AII6 üBr»$**IIII**ccregion.  The region is defined as any pixel of
  2814.             OldColor which has a path of pixels of OldColor or NewColor
  2815.             with sides touching back to the seed point, (XSeed, YSeed).
  2816.             Therefore, only pixels of OldColor are modified and no other
  2817.             information is changed.
  2818.  
  2819.             SEE ALSO
  2820.  
  2821.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  2822.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  2823.             SETVIEW
  2824.  
  2825.             EXAMPL(HNxHHO$B<BBBB<$<BBBB<<BBBB<$BBBBBF:0BBBBF:$BBBF:B<""AAA""AAAAA"<B@@B<" <2\A">>xDDxDNDD <` <>BB= > <BBBB< BBBBF:2L\bBBBB&AaQIECA8$>""">0@@A>@@@ b$(. b$(*
  2826.     $    $    $DDDDDDD¬U¬U¬U¬U¬U¬U¬Uw▌w▌w▌w▌w▌w▌w▌°°°⌠ⁿ°°⌠⌠ⁿ⌠⌠ⁿⁿ°°°    ≈  ≈  ≈≈         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       7HH7"B\DBBRL~BB@@@@@@?R~!!~?DDDD8BBBB|@@Ç>P>III>"AA""AAA"Uw<DDDD86II6"EIQ"\ @@ "AAAAA> >     hH02L2L$$<H(,$<>>>>>>>         VMODE=VIDEOMODEGET
  2827.             IF WHICHVGA = 0 THEN STOP
  2828.             DUMMY=RES640
  2829.             SETVIEW 100, 100, 539, 379
  2830.             FILLVIEW 10
  2831.             WHILE INKEY$ = ""
  2832.             WEND
  2833.             VIDEOMODESET VMODE
  2834.             END
  2835.  
  2836.  
  2837.  
  2838.  
  2839.  
  2840.  
  2841.  
  2842.  
  2843.  
  2844.  
  2845.  
  2846.  
  2847.  
  2848.  
  2849.  
  2850.  
  2851.                                                                          63
  2852.  
  2853.  
  2854.  
  2855.  
  2856.  
  2857.           FONTGETINFO
  2858.  
  2859.             PROTOTYPE
  2860.  
  2861.             SUB FONTGETINFO (Width%, Height%)
  2862.  
  2863.             INPUT
  2864.  
  2865.             no input parameters
  2866.     WEND
  2867.             MOUSEEXIT
  2868.             VIDEOMODESET VMODE
  2869.             END
  2870.  
  2871.  
  2872.  
  2873.  
  2874.  
  2875.  
  2876.  
  2877.  
  2878.  
  2879.  
  2880.  
  2881.  
  2882.  
  2883.  
  2884.  
  2885.  
  2886.  
  2887.  
  2888.  
  2889.  
  2890.  
  2891.  
  2892.  
  2893.  
  2894.  
  2895.  
  2896.  
  2897.  
  2898.  
  2899.  
  2900.  
  2901.  
  2902.  
  2903.  
  2904.  
  2905.  
  2906.  
  2907.  
  2908.  
  2909.  
  2910.                                                                          86
  2911.  
  2912.  
  2913.  
  2914.  
  2915.  
  2916.           MOUSECURSORDEFAULT
  2917.  
  2918.             PROTOTYPE
  2919.  
  2920.             SUB MOUSECURSORDEFAULT ()
  2921.  
  2922.             INPUT
  2923.  
  2924.             no input parameters
  2925.  
  2926.             OUTPUT
  2927.  
  2928.             no value returned
  2929.  
  2930.             USAGE
  2931.  
  2932.             MOUSECURSORDEFAULT defines the mouse cursor to be a small
  2933.        ,K$╖┼╘╤░XQ)σ┤ö≡÷┴─┤àñT┘,╘¬àñX9╘⌠àñ\9╘UÜ╢≤`9╘4a╘d9╘UTa╘h9╘ta╘l9╘Uöa╘p9╘┤a╘t┘PT±x┴îÇ╖0▓ïα│ÅαU┤ôα╡ùα╢¢α╖úΓ╘pǺΓ╕¡αë ╚┴πì°sKÉφb<$⌡▌ë     φë φë I1φë  Eφë $YφÆë (mφë ,üφë 0$òφë á⌐φë ñ╜φë I¿╤φë ¼σφë ░∙φÆë 4²ë ┤!²ë ╕$5²ë ╝I²ë └]²ë ⌐8q²ë <àⁿΦiǬ∙PÖÇ ¥Ç
  2934. ⁿ░╨â@%8@ΓΦá╝╤░≡cÑÅ*$░╕≡ż≡τ╥m¿⌡ε    ╨@#µ≈$âh$âαra╨à`¥è∩Ç%Ç +─▀ TîcOî∩â°1<@  [$¿Ç¼ MMl·0ƒ Y¼─!%6a▐è ¥ì ßá+?±  P<îaTTV ╪iÇ¡≥░ `_ñ»%Çá᪠P█º»ε`éa∙É%H«┴íA%Gár∙É
  2935. iw∙Éiφ`╧≥≡╤Çmⁿ▒
  2936. ]ÆAáσw7░⌡∩    $·╟Ç√É&^`  ┐ $ⁿ  $■ $╒ nk$J-ÉQ1£PéBù »0αQ/Ñ4╜£░ºP≈Ñ4Ç⌡$(ª▀$@C]Æé≈└╕_SÇçÑ4=iÉ⌠ä╣<_np@Ñ45ò▒Y3ü¼Qí░.i>╠@5+┴╙É╛╙$@ #┴@«╦
  2937. $╤
  2938. #@Ñú4,p&e÷ü¼_ÇQºÑ4òQ  ü@;¡_áQ@e╠≥@mp!┤a╘O░√`Pñź ÇT°8ÿ!¼Åñ$½╙"q¿ PñCÇ¿α√└╥░eT"ß<p°%Pæ(╧%pδ¥/OêW0Ǽbφ φ B@[â¼8â≥µ≤(    ¿⌡%(Ç∩áTÿp+ óÜ▓0!Σ±(1±░┤ÖÇD└D0Å╡`   $ «îO@╧1
  2939. a╝╤j-0ñ│`@╖bΦaT1═⌠╝╤Σ²¼±,1öíî9lÿ28ÇÅ`Γî¿P²$,N0┴O0a╫δ≤0σú`°î╖#0δ≡└X▄1»Σî(▒¥Ç█Ñ"qá√1CÇú╟╨º Å
  2940. FT Θ²î└1ÇY0    w ²à░$@AÅ`╦Φ¼╘`▄1A  }┐Ç*5 ΩSδδî`¼îaδæ¼î5 1¿⌡Ω╜⌠ ¼¥╬ü└Qî1S╛≤î9╨iÇ,∙PU(}Ç$üÇ àÇ`σìÇ`QαÜBO$%ÿÇ╧"$Ç«Ç]É.┬\`%WÉ$  W0 ÄâO0]αG┬ur╩░£▒Q¢ú╔Ç≡°s?`X0╘`@ µWâ@╣aá εdq`¥9?Ç&+o0µyÄΣAÅuV(7P╬±@IdQ╕@Å┤@;Ç▓?Çò│CÇ┤╟╨╡KÇÄ30ⁿφ° ó╬ì+]Ä╦≡     Mö╝σ ²y5<!└▀óâ╝É3~mp    $<╛≤9Æ-2ⁿ≡@T,╞Σa,)Pæ└¥#¼╪Q┤S(¼@Aîa≡╤@Ö²±⌠KëD─┴▒▀0╨Ñ$╩-0 ╨ê*╙▓edm`î=3Kß-10è=≥≤²└£mîjy ÿe²ⁿ╨i╕e▓ΣmαÖ╢C%Ç*ê*0 EátQZ`mÄLP%    °üⁿªüNQ∙  T¿<qtWΩc z░ÅÇñΩçǪçÇ«;└<┐á¼¥. á?<Σscî)áí := 0;
  2941.       end;
  2942.     end;
  2943.   end;
  2944.   WaitToGo;
  2945. end; { UserLineStylePlay }
  2946.  
  2947.  
  2948. procedure SayGoodbye;
  2949. { Say goodbye and then exit the program }
  2950. var
  2951.   ViewInfo : ViewPortType;
  2952. begin
  2953.   MainWindow('');
  2954.   GetViewSettings(ViewInfo);
  2955.   SetTextStyle(TriplexFont, HorizDir, 4);
  2956.   SetTextJustify(CenterText, CenterText);
  2957.   with ViewInfo do
  2958.     OutTextXY((x2-x1) div 2, (y2-y1) div 2, 'That''s all folks!');
  2959.   StatusLine('Press any key to quit...');
  2960.   repeat until KeyPressed;
  2961. end; { SayGoodbye }
  2962.  
  2963.  
  2964. PROCEDURE SelectMode;
  2965. VAR
  2966.     choice1,choice2     : CHAR;
  2967.    xsize,ysize            : WORD;
  2968. BEGIN
  2969.     (* Let's select a mode *)
  2970.     ClrScr;
  2971.     WriteLn('VESADEMO:');
  2972.     WriteLn('1. 256 colors');
  2973.     WriteLn('2. 32768 colors');
  2974.     WriteLn('3. 65536 colors');
  2975.     WriteLn('4. 16777216 colors');
  2976.     WriteLn('Q uit');
  2977.     WriteLn;
  2978.     Write('Your choice: ');
  2979.     REPEAT
  2980.         ReadLn(choice1);
  2981.       IF choice1 <> '1' THEN BEGIN
  2982.           WriteLn('Sorry !');
  2983.          WriteLn('This demo wasn''t written for more as 256 colors !');
  2984.          WriteLn('You would only get a limited impression of the Hi-& TrueColor modes...');
  2985.          WriteLn('Switching to 256 colors.');
  2986.          choice1 := '1';
  2987.       END;
  2988.     UNTIL choice1 IN ['1'..'4','q'];
  2989.     IF choice1 = 'q' THEN Halt;
  2990.  
  2991.     WriteLn;
  2992.     WriteLn;
  2993.     WriteLn('a. 320x200');
  2994.     WriteLn('b. 640x480');
  2995.     WriteLn('c. 800x600');
  2996.     WriteLn('d. 1024x768');
  2997.     WriteLn('e. 1280x1024');
  2998.     WriteLn('Q uit');
  2999.     WriteLn;
  3000.     Write('Your choice: ');
  3001.     REPEAT
  3002.         ReadLn(choice2);
  3003.     UNTIL choice2 IN ['a'..'e','q'];
  3004.     IF choice2 = 'q' THEN Halt;
  3005.  
  3006.     CASE choice2 OF
  3007.         'a' : BEGIN
  3008.             xsize := 320;
  3009.             ysize := 200;
  3010.         END;
  3011.         'b' : BEGIN
  3012.             xsize := 640;
  3013.             ysize := 480;
  3014.         END;
  3015.         'c' : BEGIN
  3016.             xsize := 800;
  3017.             ysize := 600;
  3018.         END;
  3019.         'd' : BEGIN
  3020.             xsize := 1024;
  3021.             ysize := 768;
  3022.         END;
  3023.         'e' : BEGIN
  3024.             xsize := 1280;
  3025.             ysize := 1024;
  3026.         END;
  3027.     END;
  3028.     CASE choice1 OF
  3029.         '1' : mode := FindVesaMode(xsize,ysize,8);
  3030.         '2' : mode := FindVesaMode(xsize,ysize,15);
  3031.         '3' : mode := FindVesaMode(xsize,ysize,16);
  3032.         '4' : mode := FindVesaMode(xsize,ysize,24);
  3033.     END;
  3034.     IF mode = 0 THEN BEGIN
  3035.         WriteLn('No such mode could be found !');
  3036.         WriteLn('Switching to to 320x200.');
  3037.         ReadKey;
  3038.         mode := V320x200x256;
  3039.     END;
  3040. END;
  3041.  
  3042. begin { program body }
  3043.   SelectMode;
  3044.   Initialize;
  3045.   ReportStatus;
  3046.  
  3047. {  AspectRatioPlay; }
  3048.   FillEllipsePlay;
  3049.   SectorPlay;
  3050.   WriteModePlay;
  3051.  
  3052.   ColorPlay;
  3053.   { PalettePlay only intended to work on these drivers: }
  3054.   if (GraphDriver = EGA) or
  3055.       (GraphDriver = EGA64) or
  3056.       (GraphDriver = VGA) then
  3057.      PalettePlay;
  3058.   PutPixelPlay;
  3059. {  PutImagePlay; }
  3060.   RandBarPlay;
  3061.   BarPlay;
  3062.   Bar3DPlay;
  3063.   ArcPlay;
  3064.   CirclePlay;
  3065.   PiePlay;
  3066.   LineToPlay;
  3067.   LineRelPlay;
  3068. {  LineStylePlay; }
  3069. {  UserLineStylePlay; }
  3070.   TextDump;
  3071.   TextPlay;
  3072.   CrtModePlay;
  3073.   FillStylePlay;
  3074.   FillPatternPlay;
  3075.   PolyPlay;
  3076.   SayGoodbye;
  3077. {  CloseGraph; }
  3078.   CloseVesa;
  3079. end.
  3080. ***************************************************
  3081.     '* SHOW D2ROTATE (ABOUT THE ORIGIN)
  3082.     '****************************************************************∞╥≤c≤*φè#^│v/╒:j═φ0t+l▓ô"¬"g└≡?%ªêΣ│H╫½╫╜├¿U'╒⌐⌡ ßV?╩¬ujOΦçEZ1∞▐! ▄B╛Σ8║æ]1GlNÜ┐q▌▓;ô$ΦzE<cª*bEô#ä╧ñÅ"∩─LrdaÖ ╠º╫a^¥£å╬1~)@ëÖMδ╫0═6DäFê¬Çv┼ß╨kæpτ╪É)}ª 1w3╤╧ü⌡¥╓h▓╣≈ïÅaÑ[TⁿHqªÉ╝DKÄ─Y-∞tT╤Θ╨º╟╪.*ÇI9lΦ≈{πτcσ$τπßoFr╪╨∩┼╞╟;O2■e²LÜ4^N|╪½ÅO?╔°FOz`╟╟╟'<>>π$πΘù6·Xgî╖│°oîδπGƒd╝▀░?■╪╔_9L ⌡ôⁿq'æO▀ƒn4╔▀╚▄┼3pτ.òO°·}÷╕ⁿ±'æO?ít│!√8ßÑ≤/┐╣p┼≥┘E╦Vox╕cΦé5╟╚º╙$?√$≥ΘZεsî≡åìΓpKù¢ïß X╥ 9╞≈\µk┤O¥_ 5Üö\≤éÄ┌╤A[╤ÿáï┼éNⁿÅu16    g,%hc╙╨cD╨Vï┘R¢öKñR;8εáΣ╢╪ós╤π╡á└èxgzPÄMú╫yαºÉ+σJ¢i+▓â3╥    ═Ñ╙î^ºG▓█πérφçs %#(╗⌠?┼%u8≡6+QÉ))ò)Afw≈╣╪)B&4░åLXV:δät@Å.;5Φf╢Ät┐ΣJ╫─U8úÇ╟éö£╕p╔┴⌠vg╨╬╥é÷╪╣┬ΓI.ç≡^v╤ZΦÇ& ╒┌6ñô6XßNè╡╬E₧Ñ
  3083. kIº╠▄A+╣╥éb²tæ-Y¡½αÑa═uuîÇ╢αêvhuª╡SÅ┤vèùú¥F;p<d⌐/F─d█éT%▓KΦû=q■öI┐ ┐╠6S$▒÷╚ENΩ¥Fû9╔┌R'╝ ╧φ└?g┬j▓0═/b╖₧─mûé╢┌»ÿÄë/·<éò■░╤╟╢├Xσ:╥P3Θ"╬Læsφ░┌öSö!╗¿*mN£WΣÇ£┤~#╗ææ≥RΩóh:à▌.æ≈╕▌v£äàd▒à╒├=░╖π║$howeg*╬    6ù▄ƒô╕φ░Ö╢qΘD>(w@úKεHÆ╛öúΣU
  3084. éÜR╔╤W▄èê 2M%ó.▓SNÖA1ùJE╢║l]▓¿>\%└Å4ßO▄£â⌐& ê/)8vSP▀▓ôⁿææ√ü√ÑÄa⌠â╚4S╓╟P- ?Σá╕▓Næ*q╡UΘ▓≈^ñ·I.rúR&$Y^╚%è≡B┌≈Ceat
  3085.     Color := RandColor;
  3086.     SetColor(Color);
  3087.     SetFillStyle(Random(CloseDotFill)+1, Color);
  3088.     Bar3D(Random(MaxWidth), Random(MaxHeight),
  3089.           Random(MaxWidth), Random(MaxHeight), 0, TopOff);
  3090.   until KeyPressed;
  3091.   WaitToGo;
  3092. end; { RandBarPlay }
  3093.  
  3094. procedure ArcPlay;
  3095. { Draw random arcs on the screen }
  3096. var
  3097.   MaxRadius : word;
  3098.   EndAngle : word;
  3099.   ArcInfo : ArcCoordsType;
  3100. begin
  3101.   MainWindow('Arc / GetArcCoords demonstration');
  3102.   StatusLine('Esc aborts or press a key');
  3103.   MaxRadius := MaxY div 10;
  3104.   repeat
  3105.     SetColor(RandColor);
  3106.     EndAngle := Random(360);
  3107.     SetLineStyle(SolidLn, 0, NormWidth);
  3108.     Arc(Random(MaxX), Random(MaxY), Random(EndAngle), EndAngle, Random(MaxRadius));
  3109.     GetArcCoords(ArcInfo);
  3110.     with ArcInfo do
  3111.     begin
  3112.       Line(X, Y, XStart, YStart);
  3113.       Line(X, Y, Xend, Yend);
  3114.     end;
  3115.   until KeyPressed;
  3116.   WaitToGo;
  3117. end; { ArcPlay }
  3118.  
  3119. procedure PutPixelPlay;
  3120. { Demonstrate the PutPixel and GetPixel commands }
  3121. const
  3122.   Seed   = 1962; { A seed for the random number generator }
  3123.   NumPts = 2000; { The number of pixels plotted }
  3124.   Esc    = #27;
  3125. var
  3126.   I : word;
  3127.   X, Y, Color : word;
  3128.   XMax, YMax  : integer;
  3129.   ViewInfo    : ViewPortType;
  3130. begin
  3131.   MainWindow('PutPixel / GetPixel demonstration');
  3132.   StatusLine('Esc aborts or press a key...');
  3133.  
  3134.   GetViewSettings(ViewInfo);
  3135.   with ViewInfo do
  3136.   begin
  3137.     XMax := (x2-x1-1);
  3138.     YMax := (y2-y1-1);
  3139.   end;
  3140.  
  3141.   while not KeyPressed do
  3142.   begin
  3143.     { Plot random pixels }
  3144.     RandSeed := Seed;
  3145.     I := 0;
  3146.     while (not KeyPressed) and (I < NumPts) do
  3147.     begin
  3148.       Inc(I);
  3149.         PutPixel(Random(XMax)+1, Random(YMax)+1, RandColor);
  3150.     end;
  3151.  
  3152.     { Erase pixels }
  3153.     RandSeed := Seed;
  3154.     I := 0;
  3155.     while (not KeyPressed) and (I < NumPts) do
  3156.     begin
  3157.       Inc(I);
  3158.       X := Random(XMax)+1;
  3159.       Y := Random(YMax)+1;
  3160.       Color := GetPixel(X, Y);
  3161.         if Color = RandColor then
  3162.           PutPixel(X, Y, 0);
  3163.      end;
  3164.   end;
  3165.   WaitToGo;
  3166. end; { PutPixelPlay }
  3167.  
  3168. procedure PutImagePlay;
  3169. { Demonstrate the GetImage and PutImage commands }
  3170.  
  3171. const
  3172.   r  = 20;
  3173.   StartX = 100;
  3174.   StartY = 50;
  3175.  
  3176. var
  3177.   CurPort : ViewPortType;
  3178.  
  3179. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  3180. var
  3181.   Step : integer;
  3182. begin
  3183.   Step := Random(2*r);
  3184.   if Odd(Step) then
  3185.     Step := -Step;
  3186.   X := X + Step;
  3187.   Step := Random(r);
  3188.   if Odd(Step) then
  3189.     Step := -Step;
  3190.   Y := Y + Step;
  3191.  
  3192.   { Make saucer bounce off viewport walls }
  3193.   with CurPort do
  3194.   begin
  3195.     if (x1 + X + Width - 1 > x2) then
  3196.       X := x2-x1 - Width + 1
  3197.     else
  3198.       if (X < 0) then
  3199.         X := 0;
  3200.     if (y1 + Y + Height - 1 > y2) then
  3201.       Y := y2-y1 - Height + 1
  3202.     else
  3203.       if (Y < 0) then
  3204.         Y := 0;
  3205.   end;
  3206. end; { MoveSaucer }
  3207.  
  3208. var
  3209.   Pausetime : word;
  3210.   Saucer    : pointer;
  3211.   X, Y      : integer;
  3212.   ulx, uly  : word;
  3213.   lrx, lry  : word;
  3214.   Size      : word;
  3215.   I         : word;
  3216. begin
  3217.   ClearDevice;
  3218.   FullPort;
  3219.  
  3220.   { PaintScreen }
  3221.   ClearDevice;
  3222.   MainWindow('GetImage / PutImage Demonstration');
  3223.   StatusLine('Esc aborts or press a key...');
  3224.   GetViewSettings(CurPort);
  3225.  
  3226.   { DrawSaucer }
  3227.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  3228.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  3229.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  3230.   Circle(StartX+10, StartY-12, 2);
  3231.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  3232.   Circle(StartX-10, StartY-12, 2);
  3233.   SetFillStyle(SolidFill, MaxColor);
  3234.   FloodFill(StartX+1, StartY+4, GetColor);
  3235.  
  3236.   { ReadSaucerImage }
  3237.   ulx := StartX-(r+1);
  3238.   uly := StartY-14;
  3239.   lrx := StartX+(r+1);
  3240.   lry := StartY+(r div 3)+3;
  3241.  
  3242.   Size := ImageSize(ulx, uly, lrx, lry);
  3243.   GetMem(Saucer, Size);
  3244.   GetImage(ulx,